X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FSchema%2FLoader%2FBase.pm;h=6c6a9a73c78bdc99313314e7c51fd4b76e7835a0;hb=e94ccbea965501f951f77e650f5b0e589a967112;hp=99a5dd8895a77cbdd10973ea05cf685b84a73b5f;hpb=716870937ce4575f397fd50b9cf5c54d260f97cc;p=dbsrgits%2FDBIx-Class-Schema-Loader.git diff --git a/lib/DBIx/Class/Schema/Loader/Base.pm b/lib/DBIx/Class/Schema/Loader/Base.pm index 99a5dd8..6c6a9a7 100644 --- a/lib/DBIx/Class/Schema/Loader/Base.pm +++ b/lib/DBIx/Class/Schema/Loader/Base.pm @@ -22,9 +22,10 @@ use DBIx::Class::Schema::Loader::Utils qw/split_name dumper_squashed eval_withou use DBIx::Class::Schema::Loader::Optional::Dependencies (); use Try::Tiny; use DBIx::Class (); +use Class::Load 'load_class'; use namespace::clean; -our $VERSION = '0.07002'; +our $VERSION = '0.07006'; __PACKAGE__->mk_group_ro_accessors('simple', qw/ schema @@ -85,8 +86,10 @@ __PACKAGE__->mk_group_accessors('simple', qw/ pod_comment_spillover_length preserve_case col_collision_map + rel_collision_map real_dump_directory datetime_undef_if_invalid + _result_class_methods /); =head1 NAME @@ -516,6 +519,14 @@ Examples: col_collision_map => { '(foo).*(bar)' => 'column_%s_%s' } +=head2 rel_collision_map + +Works just like L, but for relationship names/accessors +rather than column names/accessors. + +The default is to just append C<_rel> to the relationship name, see +L. + =head1 METHODS None of these methods are intended for direct invocation by regular @@ -1008,7 +1019,7 @@ sub _relbuilder { ->{ $self->naming->{relationships}}; my $relbuilder_class = 'DBIx::Class::Schema::Loader::RelBuilder'.$relbuilder_suff; - eval "require $relbuilder_class"; die $@ if $@; + load_class $relbuilder_class; $relbuilder_class->new( $self ); }; @@ -1566,37 +1577,45 @@ sub _make_src_class { $self->_inject($table_class, @{$self->additional_base_classes}); } -sub _resolve_col_accessor_collisions { - my ($self, $table, $col_info) = @_; +sub _is_result_class_method { + my ($self, $name) = @_; - my $base = $self->result_base_class || 'DBIx::Class::Core'; - my @components = map { /^\+/ ? substr($_,1) : "DBIx::Class::$_" } @{ $self->components || [] }; + if (not $self->_result_class_methods) { + my (@methods, %methods); + my $base = $self->result_base_class || 'DBIx::Class::Core'; + my @components = map { /^\+/ ? substr($_,1) : "DBIx::Class::$_" } @{ $self->components || [] }; - my $table_name = ref $table ? $$table : $table; + for my $class ($base, @components, $self->use_moose ? 'Moose::Object' : ()) { + load_class $class; + + push @methods, @{ Class::Inspector->methods($class) || [] }; + } + + push @methods, @{ Class::Inspector->methods('UNIVERSAL') }; - my @methods; + @methods{@methods} = (); - for my $class ($base, @components, $self->use_moose ? 'Moose::Object' : ()) { - eval "require ${class};"; - die $@ if $@; + # futureproof meta + $methods{meta} = undef; - push @methods, @{ Class::Inspector->methods($class) || [] }; + $self->_result_class_methods(\%methods); } + my $result_methods = $self->_result_class_methods; - push @methods, @{ Class::Inspector->methods('UNIVERSAL') }; + return exists $result_methods->{$name}; +} - my %methods; - @methods{@methods} = (); +sub _resolve_col_accessor_collisions { + my ($self, $table, $col_info) = @_; - # futureproof meta - $methods{meta} = undef; + my $table_name = ref $table ? $$table : $table; while (my ($col, $info) = each %$col_info) { my $accessor = $info->{accessor} || $col; next if $accessor eq 'id'; # special case (very common column) - if (exists $methods{$accessor}) { + if ($self->_is_result_class_method($accessor)) { my $mapped = 0; if (my $map = $self->col_collision_map) { @@ -1610,7 +1629,7 @@ sub _resolve_col_accessor_collisions { if (not $mapped) { warn <<"EOF"; -Column $col in table $table_name collides with an inherited method. +Column '$col' in table '$table_name' collides with an inherited method. See "COLUMN ACCESSOR COLLISIONS" in perldoc DBIx::Class::Schema::Loader::Base . EOF $info->{accessor} = undef; @@ -2085,6 +2104,20 @@ below the md5: Another option is to use the L option. +=head1 RELATIONSHIP NAME COLLISIONS + +In very rare cases, you may get a collision between a generated relationship +name and a method in your Result class, for example if you have a foreign key +called C. + +This is a problem because relationship names are also relationship accessor +methods in L. + +The default behavior is to append C<_rel> to the relationship name and print +out a warning that refers to this text. + +You can also control the renaming with the L option. + =head1 SEE ALSO L