The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
# $Id$

package TheSchwartz::FuncMap;
use strict;
use base qw( Data::ObjectDriver::BaseObject );

use Carp qw( croak );

__PACKAGE__->install_properties(
    {   columns     => [qw( funcid funcname )],
        datasource  => 'funcmap',
        primary_key => 'funcid',
    }
);

sub create_or_find {
    my $class = shift;
    my ( $driver, $funcname ) = @_;

    ## Attempt to select funcmap record by name. If successful, return
    ## object, otherwise proceed with insertion and return.
    my ($map)
        = $driver->search(
        'TheSchwartz::FuncMap' => { funcname => $funcname } );
    return $map if $map;

    ## Attempt to insert a new funcmap row. Since the funcname column is
    ## UNIQUE, if the row already exists, an exception will be thrown.
    $map = $class->new;
    $map->funcname($funcname);
    eval { $driver->insert($map) };

    ## If we got an exception, try to load the record with this funcname;
    ## in all likelihood, the exception was that the record was added by
    ## another process.
    if ( my $err = $@ ) {
        ($map)
            = $driver->search(
            'TheSchwartz::FuncMap' => { funcname => $funcname } )
            or croak "Can't find or create funcname $funcname: $err";
    }
    return $map;
}

1;