Reformat add_relationship_accessor for future edit
[dbsrgits/DBIx-Class.git] / lib / DBIx / Class / Relationship / ProxyMethods.pm
CommitLineData
75d07914 1package # hide from PAUSE
c0e7b4e5 2 DBIx::Class::Relationship::ProxyMethods;
b28cc0ba 3
4use strict;
5use warnings;
ddc0a6c8 6use Sub::Name ();
1edd1722 7use base qw/DBIx::Class/;
b28cc0ba 8
8273e845 9our %_pod_inherit_config =
044e70c7 10 (
11 class_map => { 'DBIx::Class::Relationship::ProxyMethods' => 'DBIx::Class::Relationship' }
12 );
13
71e65b39 14sub register_relationship {
15 my ($class, $rel, $info) = @_;
97c96475 16 if (my $proxy_args = $info->{attrs}{proxy}) {
17 $class->proxy_to_related($rel, $proxy_args);
b28cc0ba 18 }
71e65b39 19 $class->next::method($rel, $info);
b28cc0ba 20}
21
223b8fe3 22sub proxy_to_related {
97c96475 23 my ($class, $rel, $proxy_args) = @_;
24 my %proxy_map = $class->_build_proxy_map_from($proxy_args);
223b8fe3 25 no strict 'refs';
26 no warnings 'redefine';
97c96475 27 foreach my $meth_name ( keys %proxy_map ) {
32cff863 28 my $proxy_to_col = $proxy_map{$meth_name};
97c96475 29 my $name = join '::', $class, $meth_name;
32cff863 30 *$name = Sub::Name::subname $name => sub {
31 my $self = shift;
32 my $relobj = $self->$rel;
33 if (@_ && !defined $relobj) {
34 $relobj = $self->create_related($rel, { $proxy_to_col => $_[0] });
35 @_ = ();
36 }
37 return ($relobj ? $relobj->$proxy_to_col(@_) : undef);
38 }
223b8fe3 39 }
40}
41
97c96475 42sub _build_proxy_map_from {
43 my ( $class, $proxy_arg ) = @_;
44 my $ref = ref $proxy_arg;
45
46 if ($ref eq 'HASH') {
47 return %$proxy_arg;
48 }
49 elsif ($ref eq 'ARRAY') {
50 return map {
51 (ref $_ eq 'HASH')
52 ? (%$_)
53 : ($_ => $_)
54 } @$proxy_arg;
55 }
56 elsif ($ref) {
57 $class->throw_exception("Unable to process the 'proxy' argument $proxy_arg");
58 }
59 else {
60 return ( $proxy_arg => $proxy_arg );
61 }
62}
63
b28cc0ba 641;