X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FSchema%2FLoader%2FRelBuilder.pm;h=bc8e90633f0f3abfd149cfbbae077583245194a6;hb=a7116285a72cb974e5e1848b8f202981b0106d98;hp=90051ba2346a629d483de78e25b01a318d20afd0;hpb=6e4b7bb1fa7b4a123c34ee2547165e970a920c8f;p=dbsrgits%2FDBIx-Class-Schema-Loader.git diff --git a/lib/DBIx/Class/Schema/Loader/RelBuilder.pm b/lib/DBIx/Class/Schema/Loader/RelBuilder.pm index 90051ba..bc8e906 100644 --- a/lib/DBIx/Class/Schema/Loader/RelBuilder.pm +++ b/lib/DBIx/Class/Schema/Loader/RelBuilder.pm @@ -87,6 +87,7 @@ __PACKAGE__->mk_group_accessors('simple', qw/ inflect_plural inflect_singular relationship_attrs + rel_collision_map _temp_classes /); @@ -108,6 +109,7 @@ sub new { inflect_plural => $base->inflect_plural, inflect_singular => $base->inflect_singular, relationship_attrs => $base->relationship_attrs, + rel_collision_map => $base->rel_collision_map, _temp_classes => [], }; @@ -286,6 +288,37 @@ sub _remote_relname { return $remote_relname; } +sub _resolve_relname_collision { + my ($self, $moniker, $cols, $relname) = @_; + + return $relname if $relname eq 'id'; # this shouldn't happen, but just in case + + if ($self->base->_is_result_class_method($relname)) { + if (my $map = $self->rel_collision_map) { + for my $re (keys %$map) { + if (my @matches = $relname =~ /$re/) { + return sprintf $map->{$re}, @matches; + } + } + } + + my $new_relname = $relname; + while ($self->base->_is_result_class_method($new_relname)) { + $new_relname .= '_rel' + } + + warn <<"EOF"; +Relationship '$relname' in source '$moniker' for columns '@{[ join ',', @$cols ]}' collides with an inherited method. +Renaming to '$new_relname'. +See "RELATIONSHIP NAME COLLISIONS" in perldoc DBIx::Class::Schema::Loader::Base . +EOF + + return $new_relname; + } + + return $relname; +} + sub generate_code { my ($self, $local_moniker, $rels, $uniqs) = @_; @@ -322,6 +355,9 @@ sub generate_code { my ( $local_relname, $remote_relname, $remote_method ) = $self->_relnames_and_method( $local_moniker, $rel, \%cond, $uniqs, \%counters ); + $remote_relname = $self->_resolve_relname_collision($local_moniker, $local_cols, $remote_relname); + $local_relname = $self->_resolve_relname_collision($remote_moniker, $remote_cols, $local_relname); + push(@{$all_code->{$local_class}}, { method => 'belongs_to', args => [ $remote_relname,