File Coverage

blib/lib/Net/Amazon/MechanicalTurk/ModuleUtil.pm
Criterion Covered Total %
statement 30 50 60.0
branch 3 12 25.0
condition 2 6 33.3
subroutine 9 10 90.0
pod 0 5 0.0
total 44 83 53.0


line stmt bran cond sub pod time code
1             package Net::Amazon::MechanicalTurk::ModuleUtil;
2 25     25   124 use strict;
  25         39  
  25         755  
3 25     25   120 use warnings;
  25         39  
  25         602  
4 25     25   22275 use IO::Dir;
  25         376993  
  25         1423  
5 25     25   238 use Carp;
  25         54  
  25         8035  
6              
7             our $VERSION = '1.00';
8              
9             sub listSubmodules {
10 0     0 0 0 my ($class, $package) = @_;
11 0         0 my $dir = $package;
12 0         0 $dir =~ s/::/\//g;
13 0         0 my %submodules;
14 0         0 foreach my $inc (@INC) {
15 0 0       0 next unless !ref($inc);
16 0         0 my $dh = IO::Dir->new("$inc/$dir");
17 0 0       0 if ($dh) {
18 0         0 while (my $file = $dh->read) {
19 0 0 0     0 if ($file =~ /\.pm$/i and -f "$inc/$dir/$file") {
20 0         0 my $submod = "${package}::${file}";
21 0         0 $submod =~ s/\.pm$//i;
22 0         0 $submodules{$submod} = 1;
23             }
24             }
25 0         0 $dh->close;
26             }
27             }
28 0         0 return sort keys %submodules;
29             }
30              
31             sub packageExists {
32 24     24 0 52 my ($class, $package) = @_;
33             # Symbol table black magic
34 25     25   150 no strict 'refs';
  25         57  
  25         13322  
35 24         51 return defined %{*{"${package}::"}};
  24         47  
  24         341  
36             }
37              
38             sub require {
39 24     24 0 59 my ($class, $module) = @_;
40 24 50       108 if (!$class->packageExists($module)) {
41 0         0 my $moduleFile = $module . ".pm";
42 0         0 $moduleFile =~ s/::/\//g;
43 0         0 require $moduleFile;
44             }
45             }
46              
47             sub tryRequire {
48 24     24 0 78 my ($class, $module) = @_;
49 24         55 eval {
50 24         123 Net::Amazon::MechanicalTurk::ModuleUtil->require($module);
51             };
52 24         158 return (!$@);
53             }
54              
55             sub requireFirst {
56 3     3 0 7 my $class = shift;
57 3 50 66     31 my @modules = ($#_ == 0 and UNIVERSAL::isa($_[0], "ARRAY")) ? @{$_[0]} : @_;
  0         0  
58 3         7 foreach my $module (@modules) {
59 3 50       15 if (Net::Amazon::MechanicalTurk::ModuleUtil->tryRequire($module)) {
60 3         486 return $module;
61             }
62             }
63 0           Carp::croak("Could not load any of the following modules " . join(", ", @modules) . ".");
64             }
65              
66             return 1;