File Coverage

inc/My/Module/Recommend/Any.pm
Criterion Covered Total %
statement 27 54 50.0
branch 1 18 5.5
condition 1 3 33.3
subroutine 9 14 64.2
pod 4 4 100.0
total 42 93 45.1


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