X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FRelationship%2FProxyMethods.pm;h=9623539a57441be76478996b50af870e1bdeb074;hb=97c96475;hp=7b76499c6534221414e833292cc2bcc4e167d1d9;hpb=044e70c766df798a321d35329d06e69ba52b4bd0;p=dbsrgits%2FDBIx-Class.git diff --git a/lib/DBIx/Class/Relationship/ProxyMethods.pm b/lib/DBIx/Class/Relationship/ProxyMethods.pm index 7b76499..9623539 100644 --- a/lib/DBIx/Class/Relationship/ProxyMethods.pm +++ b/lib/DBIx/Class/Relationship/ProxyMethods.pm @@ -13,30 +13,53 @@ our %_pod_inherit_config = sub register_relationship { my ($class, $rel, $info) = @_; - if (my $proxy_list = $info->{attrs}{proxy}) { - $class->proxy_to_related($rel, - (ref $proxy_list ? @$proxy_list : $proxy_list)); + if (my $proxy_args = $info->{attrs}{proxy}) { + $class->proxy_to_related($rel, $proxy_args); } $class->next::method($rel, $info); } sub proxy_to_related { - my ($class, $rel, @proxy) = @_; + my ($class, $rel, $proxy_args) = @_; + my %proxy_map = $class->_build_proxy_map_from($proxy_args); no strict 'refs'; no warnings 'redefine'; - foreach my $proxy (@proxy) { - my $name = join '::', $class, $proxy; + foreach my $meth_name ( keys %proxy_map ) { + my $proxy_to = $proxy_map{$meth_name}; + my $name = join '::', $class, $meth_name; *$name = Sub::Name::subname $name, sub { my $self = shift; my $val = $self->$rel; if (@_ && !defined $val) { - $val = $self->create_related($rel, { $proxy => $_[0] }); + $val = $self->create_related($rel, { $proxy_to => $_[0] }); @_ = (); } - return ($val ? $val->$proxy(@_) : undef); + return ($val ? $val->$proxy_to(@_) : undef); } } } +sub _build_proxy_map_from { + my ( $class, $proxy_arg ) = @_; + my $ref = ref $proxy_arg; + + if ($ref eq 'HASH') { + return %$proxy_arg; + } + elsif ($ref eq 'ARRAY') { + return map { + (ref $_ eq 'HASH') + ? (%$_) + : ($_ => $_) + } @$proxy_arg; + } + elsif ($ref) { + $class->throw_exception("Unable to process the 'proxy' argument $proxy_arg"); + } + else { + return ( $proxy_arg => $proxy_arg ); + } +} + 1;