File Coverage

blib/lib/DBIx/Class/Relationship/ProxyMethods.pm
Criterion Covered Total %
statement 30 30 100.0
branch 10 10 100.0
condition n/a
subroutine 8 8 100.0
pod 0 2 0.0
total 48 50 96.0


line stmt bran cond sub pod time code
1             package # hide from PAUSE
2             DBIx::Class::Relationship::ProxyMethods;
3              
4 379     379   176156 use strict;
  379         5695  
  379         10839  
5 379     379   1726 use warnings;
  379         621  
  379         9701  
6 379     379   1520 use base 'DBIx::Class';
  379         606  
  379         32850  
7 379     379   1796 use DBIx::Class::_Util 'quote_sub';
  379         654  
  379         16671  
8 379     379   1700 use namespace::clean;
  379         621  
  379         1946  
9              
10             our %_pod_inherit_config =
11             (
12             class_map => { 'DBIx::Class::Relationship::ProxyMethods' => 'DBIx::Class::Relationship' }
13             );
14              
15             sub register_relationship {
16 29086     29086 0 380825 my ($class, $rel, $info) = @_;
17 29086 100       72763 if (my $proxy_args = $info->{attrs}{proxy}) {
18 1978         19449 $class->proxy_to_related($rel, $proxy_args);
19             }
20 29084         328586 $class->next::method($rel, $info);
21             }
22              
23             sub proxy_to_related {
24 1978     1978 0 3005 my ($class, $rel, $proxy_args) = @_;
25 1978         12249 my %proxy_map = $class->_build_proxy_map_from($proxy_args);
26              
27             quote_sub "${class}::$_", sprintf( <<'EOC', $rel, $proxy_map{$_} )
28             my $self = shift;
29             my $relobj = $self->%1$s;
30             if (@_ && !defined $relobj) {
31             $relobj = $self->create_related( %1$s => { %2$s => $_[0] } );
32             @_ = ();
33             }
34             $relobj ? $relobj->%2$s(@_) : undef;
35             EOC
36 1976         21872 for keys %proxy_map
37             }
38              
39             sub _build_proxy_map_from {
40 1978     1978   2776 my ( $class, $proxy_arg ) = @_;
41 1978         3731 my $ref = ref $proxy_arg;
42              
43 1978 100       8333 if ($ref eq 'HASH') {
    100          
    100          
44 988         6584 return %$proxy_arg;
45             }
46             elsif ($ref eq 'ARRAY') {
47             return map {
48 661 100       1670 (ref $_ eq 'HASH')
  986         5527  
49             ? (%$_)
50             : ($_ => $_)
51             } @$proxy_arg;
52             }
53             elsif ($ref) {
54 2         23 $class->throw_exception("Unable to process the 'proxy' argument $proxy_arg");
55             }
56             else {
57 327         1249 return ( $proxy_arg => $proxy_arg );
58             }
59             }
60              
61             1;