# $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;
