File Coverage

lib/Pod/Coverage/Careful.pm
Criterion Covered Total %
statement 19 56 33.9
branch 0 14 0.0
condition 0 2 0.0
subroutine 7 9 77.7
pod 0 1 0.0
total 26 82 31.7


line stmt bran cond sub pod time code
1             package Pod::Coverage::Careful;
2              
3 1     1   1417 use strict;
  1         3  
  1         29  
4 1     1   5 use warnings;
  1         2  
  1         38  
5              
6             our $VERSION = "v1.1.0";
7              
8 1     1   6 use B;
  1         2  
  1         39  
9 1     1   5 use Devel::Symdump;
  1         2  
  1         19  
10 1     1   5 use Pod::Coverage;
  1         1  
  1         57  
11             our @ISA = qw(Pod::Coverage);
12              
13 1     1   286 BEGIN { *TRACE_ALL = \&Pod::Coverage::TRACE_ALL; }
14              
15             sub name_of_coderef {
16 0     0 0   require B;
17 0           my($coderef) = @_;
18              
19 0           my $cv = B::svref_2object($coderef);
20 0 0         return unless $cv->isa("B::CV");
21              
22 0           my $gv = $cv->GV;
23 0 0         return if $gv->isa("B::SPECIAL");
24              
25 0           my $subname = $gv->NAME;
26 0           my $packname = $gv->STASH->NAME;
27              
28 0           return $packname . "::" . $subname;
29             }
30              
31             # Shamelessly lifted from Pod::Coverage, which it
32             # modifies as needed.
33             # this one walks the symbol tree
34             sub _get_syms {
35 0     0     my $self = shift;
36 0           my $package = shift;
37              
38 0           print "requiring '$package'\n" if TRACE_ALL;
39 0           eval qq{ require $package };
40 0 0         if ($@) {
41 0           print "require failed with $@\n" if TRACE_ALL;
42 0           $self->{why_unrated} = "requiring '$package' failed";
43 0           return;
44             }
45              
46 0           print "walking symbols\n" if TRACE_ALL;
47 0           my $syms = Devel::Symdump->new($package);
48              
49 0           my @symbols;
50 0           for my $sym ( $syms->functions ) {
51              
52             # See if said method wasn't just imported *FROM ELSEWHERE*; --tchrist
53 1     1   8 my $glob = do { no strict 'refs'; \*{$sym} };
  1         1  
  1         236  
  0            
  0            
  0            
54 0           my $cv = B::svref_2object($glob);
55              
56             # in 5.005 this flag is not exposed via B, though it exists
57 0   0       my $imported_cv = eval { B::GVf_IMPORTED_CV() } || 0x80;
58 0 0         if ($cv->GvFLAGS & $imported_cv) {
59             # Only count if as absolved via import if its name hasn't changed; --tchrist
60 0           my $was_name = name_of_coderef(*{$glob}{CODE});
  0            
61 0 0         next if join("::", $package, $sym) eq $was_name;
62 0           my $his_pack = $was_name;
63 0           $his_pack =~ s/::[^:]*$//;
64 0 0         next if $package ne $his_pack;
65             }
66              
67             # check if it's on the whitelist
68 0           $sym =~ s/$self->{package}:://;
69 0 0         next if $self->_private_check($sym);
70              
71 0           push @symbols, $sym;
72             }
73 0           return @symbols;
74             }
75              
76             1;
77              
78             __END__