File Coverage

lib/aliased.pm
Criterion Covered Total %
statement 62 64 96.8
branch 15 16 93.7
condition 3 6 50.0
subroutine 16 17 94.1
pod 2 2 100.0
total 98 105 93.3


line stmt bran cond sub pod time code
1             package aliased;
2              
3             our $VERSION = '0.31';
4             $VERSION = eval $VERSION;
5              
6             require Exporter;
7             @ISA = qw(Exporter);
8             @EXPORT = qw(alias prefix);
9              
10 5     5   108615 use strict;
  5         12  
  5         1810  
11              
12             sub _croak {
13 2     2   13 require Carp;
14 2         545 Carp::croak(@_);
15             }
16              
17             sub import {
18 16     16   9579 my ( $class, $package, $alias, @import ) = @_;
19              
20 16 100       61 if ( @_ <= 1 ) {
21 3         238 $class->export_to_level(1);
22 3         124 return;
23             }
24              
25 13         26 my $callpack = caller(0);
26 13         33 _load_alias( $package, $callpack, @import );
27 11         30 _make_alias( $package, $callpack, $alias );
28             }
29              
30             sub _get_alias {
31 6     6   12 my $package = shift;
32 6         29 $package =~ s/.*(?:::|')//;
33 6         30 return $package;
34             }
35              
36             sub _make_alias {
37 11     11   20 my ( $package, $callpack, $alias ) = @_;
38              
39 11   66     42 $alias ||= _get_alias($package);
40              
41 11 100       47 my $destination = $alias =~ /::/
42             ? $alias
43             : "$callpack\::$alias";
44              
45 5     5   36 no strict 'refs';
  5         10  
  5         3010  
46 11     0   96 *{ $destination } = sub () { $package };
  11         6865  
  0         0  
47             }
48              
49             sub _load_alias {
50 17     17   40 my ( $package, $callpack, @import ) = @_;
51              
52             # We don't localize $SIG{__DIE__} here because we need to be careful about
53             # restoring its value if there is a failure. Very, very tricky.
54 17         38 my $sigdie = $SIG{__DIE__};
55             {
56 17 100       23 my $code =
  17         82  
57             @import == 0
58             ? "package $callpack; use $package;"
59             : "package $callpack; use $package (\@import)";
60 5     5   2771 eval $code;
  5     4   32108  
  5     2   92  
  4     2   1415  
  4     2   521  
  4     2   58  
  2         711  
  1         16  
  1         5  
  2         1007  
  2         116  
  2         34  
  2         100  
  2         89  
  2         24  
  2         693  
  1         131  
  1         16  
  17         1048  
61 17 100       1033 if ( my $error = $@ ) {
62 2         9 $SIG{__DIE__} = $sigdie;
63 2         12 _croak($error);
64             }
65 15 100       73 $sigdie = $SIG{__DIE__}
66             if defined $SIG{__DIE__};
67             }
68              
69             # Make sure a global $SIG{__DIE__} makes it out of the localization.
70 15 100       67 $SIG{__DIE__} = $sigdie if defined $sigdie;
71 15         45 return $package;
72             }
73              
74             sub alias {
75 2     2 1 1313 my ( $package, @import ) = @_;
76              
77 2         5 my $callpack = scalar caller(0);
78 2         8 return _load_alias( $package, $callpack, @import );
79             }
80              
81             sub prefix {
82 1     1 1 1398 my ($class) = @_;
83             return sub {
84 2     2   522 my ($name) = @_;
85 2         8 my $callpack = caller(0);
86 2 100 33     15 if ( not @_ ) {
    50          
87 1         5 return _load_alias( $class, $callpack );
88             }
89             elsif ( @_ == 1 && defined $name ) {
90 1         6 return _load_alias( "${class}::$name", $callpack );
91             }
92             else {
93 0           _croak("Too many arguments to prefix('$class')");
94             }
95 1         11 };
96             }
97              
98             1;
99             __END__