From: Michael G Schwern Date: Sat, 15 Mar 2008 07:13:01 +0000 (+0000) Subject: Simplify and speed up the accessor_name_for() code. X-Git-Tag: v0.08240~509 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=05ccf06442bb026dda959e83ef451f9f40105d2b;p=dbsrgits%2FDBIx-Class.git Simplify and speed up the accessor_name_for() code. --- diff --git a/lib/DBIx/Class/CDBICompat/AccessorMapping.pm b/lib/DBIx/Class/CDBICompat/AccessorMapping.pm index 8beaae6..a8f03e6 100644 --- a/lib/DBIx/Class/CDBICompat/AccessorMapping.pm +++ b/lib/DBIx/Class/CDBICompat/AccessorMapping.pm @@ -6,12 +6,10 @@ use warnings; sub mk_group_accessors { my ($class, $group, @cols) = @_; - unless ($class->_can_accessor_name_for || $class->_can_mutator_name_for) { - return $class->next::method($group => @cols); - } + foreach my $col (@cols) { - my $ro_meth = $class->_try_accessor_name_for($col); - my $wo_meth = $class->_try_mutator_name_for($col); + my $ro_meth = $class->accessor_name_for($col); + my $wo_meth = $class->mutator_name_for($col); # warn "class: $class / col: $col / ro: $ro_meth / wo: $wo_meth\n"; if ($ro_meth eq $wo_meth or # they're the same @@ -25,33 +23,23 @@ sub mk_group_accessors { } } -# CDBI 3.0.7 decided to change "accessor_name" and "mutator_name" to -# "accessor_name_for" and "mutator_name_for". This is recent enough -# that we should support both. CDBI does. -sub _can_accessor_name_for { - my $class = shift; - return $class->can("accessor_name_for") || $class->can("accessor_name"); -} - -sub _can_mutator_name_for { - my $class = shift; - return $class->can("mutator_name_for") || $class->can("mutator_name"); -} -sub _try_accessor_name_for { - my($class, $column) = @_; +sub accessor_name_for { + my ($class, $column) = @_; + if ($class->can('accessor_name')) { + return $class->accessor_name($column) + } - my $method = $class->_can_accessor_name_for; - return $column unless $method; - return $class->$method($column); + return $column; } -sub _try_mutator_name_for { - my($class, $column) = @_; +sub mutator_name_for { + my ($class, $column) = @_; + if ($class->can('mutator_name')) { + return $class->mutator_name($column) + } - my $method = $class->_can_mutator_name_for; - return $column unless $method; - return $class->$method($column); + return $column; } @@ -59,14 +47,11 @@ sub new { my ($class, $attrs, @rest) = @_; $class->throw_exception( "create needs a hashref" ) unless ref $attrs eq 'HASH'; foreach my $col ($class->columns) { - if ($class->_can_accessor_name_for) { - my $acc = $class->_try_accessor_name_for($col); + my $acc = $class->accessor_name_for($col); $attrs->{$col} = delete $attrs->{$acc} if exists $attrs->{$acc}; - } - if ($class->_can_mutator_name_for) { - my $mut = $class->_try_mutator_name_for($col); + + my $mut = $class->mutator_name_for($col); $attrs->{$col} = delete $attrs->{$mut} if exists $attrs->{$mut}; - } } return $class->next::method($attrs, @rest); } diff --git a/t/cdbi-t/01-columns.t b/t/cdbi-t/01-columns.t index 7b3b1c0..4166226 100644 --- a/t/cdbi-t/01-columns.t +++ b/t/cdbi-t/01-columns.t @@ -22,13 +22,13 @@ State->columns(Weather => qw/Rain Snowfall/); State->columns(Other => qw/Capital Population/); #State->has_many(cities => "City"); -sub accessor_name { +sub accessor_name_for { my ($class, $column) = @_; my $return = $column eq "Rain" ? "Rainfall" : $column; return $return; } -sub mutator_name { +sub mutator_name_for { my ($class, $column) = @_; my $return = $column eq "Rain" ? "set_Rainfall" : "set_$column"; return $return; diff --git a/t/testlib/Actor.pm b/t/testlib/Actor.pm index 62bd5ad..1659be2 100644 --- a/t/testlib/Actor.pm +++ b/t/testlib/Actor.pm @@ -15,7 +15,7 @@ __PACKAGE__->columns(All => qw/ Name Film Salary /); __PACKAGE__->columns(TEMP => qw/ nonpersistent /); __PACKAGE__->add_constructor(salary_between => 'salary >= ? AND salary <= ?'); -sub mutator_name { "set_$_[1]" } +sub mutator_name_for { "set_$_[1]" } sub create_sql { return qq{