X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FRelationship%2FAccessor.pm;h=e6d4fb4c7e1f5e8ab565452b52fa1d8274d01c4d;hb=f4dc39d649672ff4452cf827ca204a1e937bc8b7;hp=d281e00ca62d1bb140f1b6623b08f997154319a9;hpb=d46eac43287ebe244e4f622fb77fa2efa16402a9;p=dbsrgits%2FDBIx-Class.git diff --git a/lib/DBIx/Class/Relationship/Accessor.pm b/lib/DBIx/Class/Relationship/Accessor.pm index d281e00..e6d4fb4 100644 --- a/lib/DBIx/Class/Relationship/Accessor.pm +++ b/lib/DBIx/Class/Relationship/Accessor.pm @@ -25,8 +25,15 @@ sub add_relationship_accessor { if ($acc_type eq 'single') { - quote_sub "${class}::${rel}" => sprintf(<<'EOC', perlstring $rel); + my @qsub_args = ( {}, { + attributes => [qw( + DBIC_method_is_single_relationship_accessor + DBIC_method_is_generated_from_resultsource_metadata + )] + }); + + quote_sub "${class}::${rel}" => sprintf(<<'EOC', perlstring $rel), @qsub_args; my $self = shift; if (@_) { @@ -39,21 +46,24 @@ sub add_relationship_accessor { else { my $rsrc = $self->result_source; - my $relcond = $rsrc->_resolve_relationship_condition( - rel_name => %1$s, - foreign_alias => %1$s, - self_alias => 'me', - self_result_object => $self, - ); + my $jfc; return undef if ( - $relcond->{join_free_condition} - and - $relcond->{join_free_condition} ne DBIx::Class::_Util::UNRESOLVABLE_CONDITION + + $rsrc->relationship_info(%1$s)->{attrs}{undef_on_null_fk} + and - scalar grep { not defined $_ } values %%{ $relcond->{join_free_condition} || {} } + + $jfc = ( $rsrc->resolve_relationship_condition( + rel_name => %1$s, + foreign_alias => %1$s, + self_alias => 'me', + self_result_object => $self, + )->{join_free_condition} || {} ) + and - $rsrc->relationship_info(%1$s)->{attrs}{undef_on_null_fk} + + grep { not defined $_ } values %%$jfc ); my $val = $self->related_resultset( %1$s )->single; @@ -100,24 +110,73 @@ EOC return $pk_val; }, }); + + + # god this is horrible... + my $acc = + $rsrc->columns_info->{$rel}{accessor} + || + $rel + ; + + # because CDBI may elect to never make an accessor at all... + if( my $main_cref = $class->can($acc) ) { + + attributes->import( + $class, + $main_cref, + qw( + DBIC_method_is_filter_relationship_accessor + DBIC_method_is_generated_from_resultsource_metadata + ), + ); + + if( my $extra_cref = $class->can("_${acc}_accessor") ) { + attributes->import( + $class, + $extra_cref, + qw( + DBIC_method_is_filter_relationship_extra_accessor + DBIC_method_is_generated_from_resultsource_metadata + ), + ); + } + } } elsif ($acc_type eq 'multi') { - quote_sub "${class}::${rel}", sprintf( <<'EOC', perlstring $rel ); + my @qsub_args = ( + {}, + { + attributes => [qw( + DBIC_method_is_multi_relationship_accessor + DBIC_method_is_generated_from_resultsource_metadata + DBIC_method_is_indirect_sugar + )] + }, + ); + + + quote_sub "${class}::${rel}", sprintf( <<'EOC', perlstring $rel ), @qsub_args; DBIx::Class::_ENV_::ASSERT_NO_INTERNAL_INDIRECT_CALLS and DBIx::Class::_Util::fail_on_internal_call; DBIx::Class::_ENV_::ASSERT_NO_INTERNAL_WANTARRAY and my $sog = DBIx::Class::_Util::fail_on_internal_wantarray; shift->related_resultset(%s)->search( @_ ) EOC - quote_sub "${class}::${rel}_rs", sprintf( <<'EOC', perlstring $rel ); + $qsub_args[1]{attributes}[0] + =~ s/^DBIC_method_is_multi_relationship_accessor$/DBIC_method_is_multi_relationship_extra_accessor/ + or die "Unexpected attr '$qsub_args[1]{attributes}[0]' ..."; + + + quote_sub "${class}::${rel}_rs", sprintf( <<'EOC', perlstring $rel ), @qsub_args; DBIx::Class::_ENV_::ASSERT_NO_INTERNAL_INDIRECT_CALLS and DBIx::Class::_Util::fail_on_internal_call; shift->related_resultset(%s)->search_rs( @_ ) EOC - quote_sub "${class}::add_to_${rel}", sprintf( <<'EOC', perlstring $rel ); + quote_sub "${class}::add_to_${rel}", sprintf( <<'EOC', perlstring $rel ), @qsub_args; DBIx::Class::_ENV_::ASSERT_NO_INTERNAL_INDIRECT_CALLS and DBIx::Class::_Util::fail_on_internal_call; shift->create_related( %s => @_ ); EOC