X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FCDBICompat%2FColumnCase.pm;h=0f847dbfc00855a91cf57ce2c3dfc8e5cd477c89;hb=aa11d765d7345d63fbc497b4b5c16776eedbaa6e;hp=ae0a20009a571690a09383d5ffe8d9633f0463e1;hpb=7fb16f1a1bf1e7de4098b4f4ac3d061312f6bac3;p=dbsrgits%2FDBIx-Class.git diff --git a/lib/DBIx/Class/CDBICompat/ColumnCase.pm b/lib/DBIx/Class/CDBICompat/ColumnCase.pm index ae0a200..0f847db 100644 --- a/lib/DBIx/Class/CDBICompat/ColumnCase.pm +++ b/lib/DBIx/Class/CDBICompat/ColumnCase.pm @@ -1,4 +1,5 @@ -package DBIx::Class::CDBICompat::ColumnCase; +package # hide from PAUSE + DBIx::Class::CDBICompat::ColumnCase; use strict; use warnings; @@ -10,15 +11,10 @@ sub _register_column_group { return $class->next::method($group => map lc, @cols); } -sub _register_columns { - my ($class, @cols) = @_; - return $class->next::method(map lc, @cols); -} - sub add_columns { my ($class, @cols) = @_; - $class->result_source->add_columns(map lc, @cols); - $class->_mk_column_accessors(@cols); + $class->mk_group_accessors(column => @cols); + $class->result_source_instance->add_columns(map lc, @cols); } sub has_a { @@ -30,8 +26,8 @@ sub has_a { sub has_many { my ($class, $rel, $f_class, $f_key, @rest) = @_; - return $class->next::method($rel, $f_class, ( ref($f_key) ? - $f_key : + return $class->next::method($rel, $f_class, ( ref($f_key) ? + $f_key : lc($f_key) ), @rest); } @@ -70,28 +66,83 @@ sub find_column { return $class->next::method(lc($col)); } -sub _mk_group_accessors { - my ($class, $type, $group, @fields) = @_; - #warn join(', ', map { ref $_ ? (@$_) : ($_) } @fields); - my @extra; - foreach (@fields) { - my ($acc, $field) = ref $_ ? @$_ : ($_, $_); - #warn "$acc ".lc($acc)." $field"; - next if defined &{"${class}::${acc}"}; - push(@extra, [ lc $acc => $field ]); - } - return $class->next::method($type, $group, - @fields, @extra); +# _build_query +# +# Build a query hash for find, et al. Overrides Retrieve::_build_query. + +sub _build_query { + my ($self, $query) = @_; + + my %new_query; + $new_query{lc $_} = $query->{$_} for keys %$query; + + return \%new_query; } -sub _cond_key { - my ($class, $attrs, $key, @rest) = @_; - return $class->next::method($attrs, lc($key), @rest); + +# 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 1; + } } -sub _cond_value { - my ($class, $attrs, $key, @rest) = @_; - return $class->next::method($attrs, lc($key), @rest); +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 {