File Coverage

blib/lib/Sub/Installer.pm
Criterion Covered Total %
statement 54 54 100.0
branch 7 10 70.0
condition 2 6 33.3
subroutine 14 14 100.0
pod 2 2 100.0
total 79 86 91.8


line stmt bran cond sub pod time code
1             package Sub::Installer;
2              
3 5     5   33241 use version; $VERSION = qv('0.0.3');
  5         19843  
  5         29  
4              
5 5     5   552 use warnings;
  5         92  
  5         154  
6 5     5   24 use strict;
  5         15  
  5         244  
7 5     5   26 use Carp;
  5         7  
  5         984  
8              
9              
10             sub reinstall_sub {
11 6     6 1 6270 my ($package_name, $sub_def_ref) = @_;
12 6 50 33     61 croak "Usage: PackageName->reinstall_sub( \%sub_def )"
13             unless @_==2 && ref $sub_def_ref eq 'HASH';
14 5     5   28 no warnings 'redefine';
  5         10  
  5         468  
15 6         10 my $last_install;
16 6         10 for my $sub_name (keys %{$sub_def_ref}) {
  6         24  
17 5     5   84 no strict 'refs';
  5         10  
  5         2559  
18 8         33 *{$package_name.'::'.$sub_name}
  7         86  
19             = $last_install
20             = Sub::Installer::Util::_normalize_sub($package_name, $sub_name, $sub_def_ref->{$sub_name});
21             }
22 5         31 return $last_install;
23             }
24              
25             sub install_sub {
26 5     5 1 6625 my ($package_name, $sub_def_ref) = @_;
27 5 50 33     61 croak "Usage: PackageName->install_sub( \%sub_def )"
28              
29             unless @_==2 && ref $sub_def_ref eq 'HASH';
30 5         9 my $last_install;
31 5     5   30 use warnings 'redefine';
  5         9  
  5         514  
32 5         11 for my $sub_name (keys %{$sub_def_ref}) {
  5         22  
33 5     5   26 no strict 'refs';
  5         11  
  5         455  
34 7         29 *{$package_name.'::'.$sub_name}
  7         57  
35             = $last_install
36             = Sub::Installer::Util::_normalize_sub($package_name, $sub_name, $sub_def_ref->{$sub_name});
37             }
38 5         471 return $last_install;
39             }
40              
41             package Sub::Installer::Util;
42              
43 5     5   25 use Carp;
  5         10  
  5         1885  
44              
45             sub _normalize_sub {
46 15     15   36 my ($package_name, $sub_name, $sub_code) = @_;
47 15 100       53 if (!ref $sub_code) {
48 5 50       19 if ($sub_code !~ /\A \s* sub \s* [{] .* [}] \s* \Z/xms) {
49 5         13 $sub_code = "sub { $sub_code }";
50             }
51 5 100   1   625 $sub_code = eval "package $package_name; $sub_code"
  1         36  
  1         460  
52             or croak "Can't install invalid code: $@";
53             }
54 14         35 return $sub_code;
55             }
56              
57             package UNIVERSAL;
58 5     5   83 use base 'Sub::Installer';
  5         9  
  5         728  
59              
60             1; # Magic true value required at end of module
61             __END__