X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FCDBICompat%2FColumnCase.pm;h=7f308e876dad91c03b6e77f41e13d1da084272fd;hb=28ef9468343a356954f0e4dc6bba1b834a8b3c3c;hp=0f847dbfc00855a91cf57ce2c3dfc8e5cd477c89;hpb=e60dc79fcd4d6318e83584b826526e65048b86a9;p=dbsrgits%2FDBIx-Class.git diff --git a/lib/DBIx/Class/CDBICompat/ColumnCase.pm b/lib/DBIx/Class/CDBICompat/ColumnCase.pm index 0f847db..7f308e8 100644 --- a/lib/DBIx/Class/CDBICompat/ColumnCase.pm +++ b/lib/DBIx/Class/CDBICompat/ColumnCase.pm @@ -4,31 +4,38 @@ package # hide from PAUSE use strict; use warnings; -use base qw/DBIx::Class/; +use base 'DBIx::Class'; sub _register_column_group { my ($class, $group, @cols) = @_; return $class->next::method($group => map lc, @cols); } -sub add_columns { +sub add_columns :DBIC_method_is_bypassable_resultsource_proxy { my ($class, @cols) = @_; - $class->mk_group_accessors(column => @cols); - $class->result_source_instance->add_columns(map lc, @cols); + return $class->result_source->add_columns(map lc, @cols); } sub has_a { - my ($class, $col, @rest) = @_; - $class->next::method(lc($col), @rest); - $class->mk_group_accessors('inflated_column' => $col); - return 1; + my($self, $col, @rest) = @_; + + $self->_declare_has_a(lc $col, @rest); + $self->_mk_inflated_column_accessor($col); + + return 1; } sub has_many { my ($class, $rel, $f_class, $f_key, @rest) = @_; - return $class->next::method($rel, $f_class, ( ref($f_key) ? - $f_key : - lc($f_key) ), @rest); + return $class->next::method( + $rel, + $f_class, + (ref($f_key) ? + $f_key : + lc($f_key||'') + ), + @rest + ); } sub get_inflated_column { @@ -79,71 +86,15 @@ sub _build_query { return \%new_query; } +sub _deploy_accessor { + my($class, $name, $accessor) = @_; -# CDBI will never overwrite an accessor, but it only uses one -# accessor for all column types. DBIC uses many different -# accessor types so, for example, if you declare a column() -# and then a has_a() for that same column it must overwrite. -# -# To make this work CDBICompat has decide if an accessor -# method was put there by itself and only then overwrite. -{ - my %our_accessors; - - sub _has_custom_accessor { - my($class, $name) = @_; - - no strict 'refs'; - my $existing_accessor = *{$class .'::'. $name}{CODE}; - return $existing_accessor && !$our_accessors{$existing_accessor}; - } - - sub _deploy_accessor { - my($class, $name, $accessor) = @_; - - return if $class->_has_custom_accessor($name); - - for my $name ($name, lc $name) { - no strict 'refs'; - no warnings 'redefine'; - *{$class .'::'. $name} = $accessor; - } - - $our_accessors{$accessor}++; + return if $class->_has_custom_accessor($name); - return 1; - } + $class->next::method(lc $name => $accessor); + return $class->next::method($name => $accessor); } -sub _mk_group_accessors { - my ($class, $type, $group, @fields) = @_; - - # So we don't have to do lots of lookups inside the loop. - my $maker = $class->can($type) unless ref $type; - - # warn "$class $type $group\n"; - foreach my $field (@fields) { - if( $field eq 'DESTROY' ) { - carp("Having a data accessor named DESTROY in ". - "'$class' is unwise."); - } - - my $name = $field; - - ($name, $field) = @$field if ref $field; - - my $accessor = $class->$maker($group, $field); - my $alias = "_${name}_accessor"; - - # warn " $field $alias\n"; - { - no strict 'refs'; - - $class->_deploy_accessor($name, $accessor); - $class->_deploy_accessor($alias, $accessor); - } - } -} sub new { my ($class, $attrs, @rest) = @_;