File Coverage

blib/lib/Class/groups.pm
Criterion Covered Total %
statement 78 83 93.9
branch 33 42 78.5
condition 17 23 73.9
subroutine 9 9 100.0
pod 1 1 100.0
total 138 158 87.3


line stmt bran cond sub pod time code
1             package Class::groups ;
2             $VERSION = 2.30 ;
3 5     5   23659 use 5.006_001 ;
  5         17  
  5         193  
4 5     5   24 use strict ;
  5         18  
  5         286  
5              
6             # This file uses the "Perlish" coding style
7             # please read http://perl.4pro.net/perlish_coding_style.html
8              
9             ; use Class::props
10 5     5   2770 ; our @ISA = qw| Class::props |
  5         11  
  5         143  
11              
12             ; use Carp
13 5     5   48 ; $Carp::Internal{+__PACKAGE__}++
  5         8  
  5         1260  
14              
15             ; sub import
16 14     14   3563 { my $tool = shift
17 14         60 ; $tool->add_to(scalar caller, @_)
18             }
19              
20             ; sub add_to
21 14     14 1 31 { my ( $tool, $pkg, @args ) = @_
22 14         149 ; foreach my $group ( @args )
23 11 50       49 { $group = { name => $group }
24             unless ref $group eq 'HASH'
25 11 50       46 ; $$group{name} = [ $$group{name} ]
26             unless ref $$group{name} eq 'ARRAY'
27 11         19 ; foreach my $n ( @{$$group{name}} )
  11         26  
28 11 100 66     54 { if ( not(defined $$group{no_strict})
29             && not(defined $$group{props})
30             )
31 1         2 { $$group{no_strict} = 1
32             }
33             ; my @group_props
34 11         17 ; foreach my $prop ( @{$$group{props}} )
  11         13  
  11         60  
35 11         52 { $prop = $tool->_init_prop_param( $prop )
36 11         15 ; push @group_props, @{$$prop{name}}
  11         25  
37 11         20 ; $$prop{group} = $n
38 11         50 ; $tool->_add_prop($pkg, $prop )
39             }
40 5         4292 ; no strict 'refs'
41 5     5   26 ; my $init
  5         8  
  11         21  
42 11 100       30 ; if ( @group_props )
43 10         11 { ${$tool.'::PROPS'}{$pkg}{$n} = \@group_props
  10         58  
44             ; $init = sub
45 19     19   28 { foreach my $p ( @{ ${$tool.'::PROPS'}
  19         22  
  19         103  
46             {$_[1]}
47             {$n}
48             }
49             )
50 35         243 { my $dummy = $_[0]->$p
51             }
52 19         35 ; foreach my $c ( @{$_[1].'::ISA'} )
  19         93  
53 9         44 { $init->($_[0], $c)
54             }
55             }
56 10         43 }
57 11         8077 ; *{$pkg.'::'.$n}
58             = sub
59 40 50   40   171 { &{$$group{pre_process}} if defined $$group{pre_process}
  0         0  
60 40         63 ; my $s = shift
61 15   66     85 ; my $hash
62 12         42 = $tool =~ /^Class/ ? \%{(ref $s||$s).'::'.$n} # class
63 40 100 100     211 : $tool =~ /^Package/ ? \%{$pkg.'::'.$n} # package
    100          
64             : ( $$s{$n} ||= {} ) # object
65 40 100 100     168 ; if ( ( my $def = $$group{default} )
66             && not keys %$hash
67             )
68 2   33     17 { my $dprops
69             = ref $def eq 'HASH' && $def
70             || (ref $def eq 'CODE' || not ref $def) && $s->$def()
71 2 50       11 ; ref $dprops eq 'HASH' or croak
72             qq(Invalid "default" option for "$$group{name}[0]", died)
73 2         13 ; %$hash = %$dprops
74             }
75 40 100       85 ; if ($init)
76 10   66     53 { $init->($s, ref($s)||$s) # init defaults
77 10         21 ; undef $init
78             }
79 40         100 ; my $data
80 40 100       144 ; if ( @_ )
81 6 50       66 { if ( ref $_[0] eq 'HASH' ) # set
    100          
    50          
82 0         0 { $data = $_[0]
83             }
84             elsif ( @_ == 1 ) # get
85             { my @val
86 2 100       2 ; my @pro = ref $_[0] eq 'ARRAY' ? @{$_[0]} : $_[0]
  2         9  
  1         3  
87 2         6 ; foreach my $p ( @pro )
88 5 100 100     88 { if ( my $m = $s->can($p)
89             and grep /^$p$/, @group_props
90             )
91 2         7 { push @val, $s->$m
92             }
93             else
94 3 50       10 { if ( $$group{no_strict} )
95 3         9 { push @val, $$hash{$p}
96             }
97             else
98 0         0 { croak qq(No such property "$p", died)
99             }
100             }
101             }
102 2 100       14 ; return wantarray ? @val : $val[0]
103             }
104             elsif ( not ( @_ % 2 ) ) # set
105 4         15 { $data = { @_ }
106             }
107             else
108 0         0 { croak qq(Odd number of arguments for "$n", died)
109             }
110 4         23 ; while ( my ($p, $v) = each %$data ) # set
111 7 100 66     187 { if ( my $m = $s->can($p)
112             and grep /^$p$/, @group_props
113             )
114 6         21 { $s->$m($v)
115             }
116             else
117 1 50       4 { if ( $$group{no_strict} )
118 1         4 { $$hash{$p} = $v
119             }
120             else
121 0         0 { croak qq(No such property "$p", died)
122             }
123             }
124             }
125             }
126 38 50       268 ; wantarray ? %$hash : $hash # no argument
127             }
128 11         104 }
129             }
130             }
131              
132              
133            
134             1 ;
135              
136             __END__