File Coverage

blib/lib/Safe/World/ScanPack.pm
Criterion Covered Total %
statement 53 56 94.6
branch 6 10 60.0
condition 9 12 75.0
subroutine 9 9 100.0
pod 0 2 0.0
total 77 89 86.5


line stmt bran cond sub pod time code
1             #############################################################################
2             ## Name: ScanPack.pm
3             ## Purpose: Safe::World::ScanPack
4             ## Author: Graciliano M. P.
5             ## Modified by:
6             ## Created: 08/09/2003
7             ## RCS-ID:
8             ## Copyright: (c) 2003 Graciliano M. P.
9             ## Licence: This program is free software; you can redistribute it and/or
10             ## modify it under the same terms as Perl itself
11             #############################################################################
12            
13             package Safe::World::ScanPack ;
14 1     1   24 use 5.003 ;
  1         3  
  1         49  
15            
16 1     1   6 use vars qw($VERSION *ENTRY);
  1         2  
  1         66  
17            
18             $VERSION = '0.01';
19            
20 1     1   7 no warnings ;
  1         3  
  1         60  
21            
22             #######
23             # NEW #
24             #######
25            
26             sub new {
27 1     1 0 3 my(undef,@packages) = @_;
28 1     1   6 no strict "refs" ;
  1         3  
  1         169  
29 1         5 my $self = bless({}, __PACKAGE__) ;
30            
31 1         6 my @packs = $self->_scan(@packages) ;
32            
33 1         7 @packs = sort @packs ;
34 1         2 $self->{PACKAGES} = \@packs ;
35            
36 1         5 delete $self->{SCANNEDS} ;
37            
38 1         5 return $self ;
39             }
40            
41             #########
42             # _SCAN #
43             #########
44            
45             sub _scan {
46 4     4   5 my $self = shift ;
47 4         9 my(@packages) = @_;
48            
49 4         5 my($key,$val,$num,$pack) ;
50            
51 1     1   6 no strict "refs" ;
  1         1  
  1         103  
52            
53 0         0 my @scanneds ;
54            
55 4         14 foreach $pack (@packages) {
56 8         8 my $packref = *{"$pack\::"}{HASH} ;
  8         21  
57 8         14 $packref = "$packref" ;
58 8 50       29 if ($self->{SCANNEDS}{$packref}) { next ;}
  0         0  
59 8         16 $self->{SCANNEDS}{$packref}++ ;
60 8         11 push(@scanneds , $packref) ;
61            
62 1     1   5 no strict ;
  1         2  
  1         399  
63 8         10 while (($key,$val) = each(%{*{"$pack\::"}})) {
  26         21  
  26         133  
64 18         36 local(*ENTRY) = $val;
65            
66 18 50 66     118 if (defined $val && defined *ENTRY{HASH} && $key =~ /::$/ && $key ne "main::" && $key ne "::") {
      100        
      66        
      66        
67 4 50       12 my($p) = $pack ne "main" ? "$pack\::" : "";
68 4         20 ($p .= $key) =~ s/::$// ;
69 4         5 my $packref = *{"$p\::"}{HASH} ;
  4         7  
70 4 100       14 if ( !$self->{PACKAGES}{$p} ) {
71 3         6 $self->{PACKAGES}{$p} = 1 ;
72 3 50       9 if ( !$self->{SCANNEDS}{"$packref"} ) { push(@packages, $self->_scan($p)) ;}
  3         12  
73 0         0 else { push(@packages, $p) ;}
74             }
75             }
76             }
77             }
78            
79 4         8 foreach my $scanneds_i ( @scanneds ) {
80 8         23 delete $self->{SCANNEDS}{$scanneds_i} ;
81             }
82            
83 4         17 return @packages ;
84             }
85            
86             ############
87             # PACKAGES #
88             ############
89            
90 1     1 0 1 sub packages { return @{ $_[0]->{PACKAGES} } ;}
  1         13  
91            
92             #######
93             # END #
94             #######
95            
96            
97             1;
98            
99