File Coverage

inc/My/Module/Recommend/Any.pm
Criterion Covered Total %
statement 33 52 63.4
branch 1 14 7.1
condition 1 6 16.6
subroutine 10 14 71.4
pod 5 5 100.0
total 50 91 54.9


line stmt bran cond sub pod time code
1             package My::Module::Recommend::Any;
2              
3 2     2   52 use 5.008;
  2         9  
4              
5 2     2   13 use strict;
  2         4  
  2         59  
6 2     2   10 use warnings;
  2         4  
  2         100  
7              
8 2     2   13 use Carp;
  2         4  
  2         189  
9 2     2   14 use Exporter qw{ import };
  2         4  
  2         205  
10              
11             our $VERSION = '0.057_01';
12              
13             our @EXPORT_OK = qw{ __any };
14              
15 2     2   15 use constant RECOMMEND_TEMPLATE_SINGLE => " * %s is not available.\n";
  2         37  
  2         215  
16 2     2   15 use constant RECOMMEND_TEMPLATE_MULTI => " * None of %s is available.\n";
  2         5  
  2         1796  
17              
18             sub __any {
19 22     22   47 my ( @args ) = @_;
20 22         47 return __PACKAGE__->new( @args );
21             }
22              
23             sub new {
24 26     26 1 57 my ( $class, @modules ) = @_;
25 26 50       68 @modules > 1
26             or croak 'Must specify at least one module and a message';
27 26         45 my $msg = pop @modules;
28 26         270 $msg =~ s/ ^\s* / /smxg;
29              
30 26         56 foreach ( @modules ) {
31 32         176 my ( $name, $version ) = split qr{ = }smx, $_, 2;
32 32         100 $_ = [ $name, $version ];
33             }
34              
35 26   33     207 return bless {
36             modules => \@modules,
37             message => $msg,
38             }, ref $class || $class;
39             }
40              
41             sub check {
42 0     0 1 0 my ( $self ) = @_;
43 0         0 my @missing;
44 0         0 foreach my $m ( $self->__modules() ) {
45 0 0       0 my $msg = $self->module_is_ok( @{ $m } )
  0         0  
46             or return;
47 0         0 push @missing, $msg;
48             }
49 0         0 return @missing;
50             }
51              
52             sub module_is_ok {
53 0     0 1 0 my ( undef, $name, $version ) = @_;
54 0         0 local $@ = undef;
55             eval "require $name; 1"
56 0 0 0     0 and eval {
57 0 0       0 not $version
58             or $name->VERSION( $version );
59             } and return;
60 0 0       0 return $version ? "$name $version" : $name;
61             }
62              
63             sub modules {
64 0     0 1 0 my ( $self ) = @_;
65 0         0 return ( map { $_->[0] } $self->__modules() );
  0         0  
66             }
67              
68             sub __modules {
69 13     13   24 my ( $self ) = @_;
70 13         17 return @{ $self->{modules} };
  13         45  
71             }
72              
73             sub recommend {
74 0     0 1   my ( $self ) = @_;
75 0 0         my @missing = $self->check()
76             or return;
77 0 0         my $tplt = @missing > 1 ?
78             $self->RECOMMEND_TEMPLATE_MULTI() :
79             $self->RECOMMEND_TEMPLATE_SINGLE();
80             return sprintf( $tplt, join ', ', @missing ) .
81 0           $self->{message};
82             }
83              
84             1;
85              
86             __END__