File Coverage

blib/lib/Class/constr.pm
Criterion Covered Total %
statement 44 47 93.6
branch 17 24 70.8
condition 12 15 80.0
subroutine 6 6 100.0
pod n/a
total 79 92 85.8


line stmt bran cond sub pod time code
1             package Class::constr ;
2             $VERSION = 2.40 ;
3 10     10   144122 use 5.006_001 ;
  10         24  
4 10     10   32 use strict ;
  10         12  
  10         200  
5              
6             # This file uses the "Perlish" coding style
7             # please read http://perl.4pro.net/perlish_coding_style.html
8              
9             ; use Carp
10 10     10   29 ; $Carp::Internal{+__PACKAGE__}++
  10         26  
  10         1266  
11              
12              
13             ; sub import
14 17     17   105 { my ($pkg, @args) = @_
15 17         25 ; my $callpkg = caller
16 17   100     73 ; $args[0] ||= {}
17 17         23 ; foreach my $constr ( @args )
18 19   100     66 { my $n = $$constr{name} || 'new'
19             ; $$constr{init} &&= [ $$constr{init} ]
20 19 50 100     79 unless ref $$constr{init} eq 'ARRAY'
21 10         3066 ; no strict 'refs'
22 10     10   38 ; *{$callpkg.'::'.$n}
  10         16  
  19         2437  
23             = sub
24 0         0 { &{$$constr{pre_process}} if defined $$constr{pre_process}
25 46 50   46   5313 ; my $c = shift
  46         56  
26 46 50       154 ; my %props = ref $_[0] eq 'HASH' ? %{$_[0]} : @_
  0         0  
27 46   66     257 ; my $class = ref($c) || $c
28 46         72 ; my $s = bless {}, $class
29 46         45 ; my $default_props = {}
30 46 100       116 ; if (my $cdef = $$constr{default})
31 6   66     34 { $default_props = ref $cdef eq 'HASH' && $cdef
32             || ref $cdef eq 'CODE' && $s->$cdef(%props)
33             || not (ref $cdef) && $s->$cdef(%props)
34 6 50       31 ; ref $default_props eq 'HASH' or croak
35             "Invalid default option for '$n' ($default_props), died"
36             }
37             # Values passed to the constructor (%props)
38             # will override copied values, (%$c)
39             # which will override default values (%$default_props)
40             ; %props = ( %$default_props
41 46 100 66     215 , $$constr{copy} && ref $c ? %$c : ()
42             , %props
43             )
44             # Set the initial values for the new object
45 46         129 ; while ( my ($p, $v) = each %props )
46 41 100       219 { if (my $a = $s->can($p)) # if accessor available, use it
47 16         41 { $s->$a( $v )
48             }
49             else
50             { croak "No such property '$p', died"
51             unless $$constr{no_strict}
52 25 100       1570 ; if ( $$constr{skip_autoload} )
  13 50       14  
53 0         0 { $$s{$p} = $v
54             }
55             else
56 13         10 { eval { $s->$p( $v ) } # try AUTOLOAD
  13         58  
57 13 50       25 ; $@ && do{ $$s{$p} = $v } # no strict so just set it
  13         39  
58             }
59             }
60             }
61             # Execute any initializer methods
62 34 100       69 ; if ( $$constr{init} )
63 4         4 { foreach my $m ( @{$$constr{init}} )
  4         10  
64             # any initializer can cancel construction by undefining the
65             # object or returning a Class::Error object (false)
66             # If this happens, no need to continue
67 4 50       11 { last unless $s
68 4         16 ; $s->$m(%props)
69             }
70             }
71 34         108 ; $s
72             }#END sub
73 19         68 }#END for $constr
74             }#END import
75              
76              
77             ; 1
78              
79             __END__