File Coverage

blib/lib/Class/Util.pm
Criterion Covered Total %
statement 59 59 100.0
branch 31 36 86.1
condition 12 18 66.6
subroutine 11 11 100.0
pod 4 4 100.0
total 117 128 91.4


line stmt bran cond sub pod time code
1             package Class::Util ;
2             $VERSION = 2.30 ;
3 4     4   107567 use 5.006_001 ;
  4         18  
  4         263  
4 4     4   25 use strict ;
  4         7  
  4         173  
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 4     4   22 ; $Carp::Internal{+__PACKAGE__}++
  4         5  
  4         1151  
11              
12             ; sub import
13             { return unless @_
14 7 50   7   7458 ; require Exporter
15 7         48 ; our @ISA = 'Exporter'
  7         115  
16 7         23 ; our @EXPORT_OK = qw| load
17             gather
18             blessed
19             classes
20             |
21 7         6905 ; $_[0]->export_to_level(1, @_)
22             }
23              
24             ; sub load
25 3 50   3 1 1926 { local $_ = $_[0] if defined $_[0]
26 3         229 ; my $r = eval "require $_;"
27 3 100       17867 ; if ($@)
28 2         14 { (my $c = $_.'.pm') =~ s|\b::\b|/|g
29 4         655 ; no strict 'refs'
30 4     4   32 ; croak $@ if $@ !~ /^Can't locate $c in \@INC/
  4         6  
  1         7  
31 2 100 33     58 || not grep { /[^:][^:]\z/ } keys %{$_.'::'}
  2         287  
32             }
33 2         10 ; $r
34             }
35              
36             ; sub gather (&$;$)
37 5     5 1 1985 { my( $code, $symbol, $packages ) = @_
38 4         1553 ; no strict 'refs'
39 4 100   4   20 ; unless ( ref $packages eq 'ARRAY' )
  4         5  
  5         15  
40 3 100 100     23 { my $class = defined($packages) &&! ref($packages)
      66        
41             ? $packages
42             : blessed($packages) || caller
43 3         8 ; $packages = classes($class)
44             }
45 5         13 ; my $t = substr $symbol, 0, 1, ''
46 5 100       231 ; my $type = $t eq '*' ? 'GLOB'
    100          
    100          
    100          
    50          
47             : $t eq '&' ? 'CODE'
48             : $t eq '%' ? 'HASH'
49             : $t eq '@' ? 'ARRAY'
50             : $t eq '$' ? 'SCALAR'
51             : croak 'Identifier must start with [*&%@$], died'
52 15         58 ; map { $code->() }
  15         38  
53 15         17 map { *{$_.'::'.$symbol}{$type} }
  4         14  
54 4         9 grep { defined( $type eq 'SCALAR'
55 12         49 ? ${$_.'::'.$symbol}
56 16 100       26 : *{$_.'::'.$symbol}{$type}
57             )
58             }
59             @$packages
60             }
61              
62             ; sub blessed
63 14 100   14 1 57 { local $_ = $_[0] if defined $_[0]
64 14 100 100     113 ; defined && length && eval{ $_->isa( ref ) }
65             ? ref
66             : undef
67             }
68            
69             ; sub classes ($)
70 5     5 1 133 { my $class = shift
71 5 50       22 ; return () unless $class
72 5   66     13 ; $class = blessed($class) || $class
73 5         14 ; my @stack = ($class)
74 5         12 ; my %skip = ($class => 1)
75 5         7 ; my (@classes, $c)
76 5         16 ; while ( @stack )
77 23 50 33     100 { next unless defined($c = shift @stack) && length $c
78 23         44 ; unshift @classes, $c
79 4     4   27 ; no strict 'refs';
  4         7  
  4         506  
80 23 100       24 ; unshift @stack, map{ $skip{$_}++ ? () : $_ } @{$c.'::ISA'}
  22         84  
  23         83  
81             }
82 5 100       38 ; wantarray ? @classes : \@classes
83             }
84              
85            
86             ; 1
87              
88             __END__