File Coverage

blib/lib/Context/Preserve.pm
Criterion Covered Total %
statement 28 33 84.8
branch 9 12 75.0
condition 3 3 100.0
subroutine 5 5 100.0
pod 1 1 100.0
total 46 54 85.1


line stmt bran cond sub pod time code
1             package Context::Preserve; # git description: v0.02-4-g9a6a9b9
2             # ABSTRACT: Run code after a subroutine call, preserving the context the subroutine would have seen if it were the last statement in the caller
3 2     2   177633 use strict;
  2         19  
  2         78  
4 2     2   17 use warnings;
  2         5  
  2         85  
5 2     2   16 use Carp;
  2         5  
  2         153  
6              
7 2     2   17 use base 'Exporter';
  2         5  
  2         941  
8             our @EXPORT = qw(preserve_context);
9              
10             our $VERSION = '0.03';
11              
12             sub preserve_context(&@) {
13 9     9 1 790 my $orig = shift;
14 9         21 my %args = @_;
15              
16 9         13 my $replace = $args{replace};
17 9         13 my $after = $args{after};
18            
19 9 100 100     46 croak 'need an "after" or "replace" coderef'
20             unless $replace || $after;
21            
22 8 50       20 if(!defined wantarray){
    100          
23 0         0 $orig->();
24 0 0       0 if($after){
25 0         0 $after->();
26             }
27             else {
28 0         0 $replace->();
29             }
30 0         0 return;
31             }
32             elsif(wantarray){
33 4         8 my @result = $orig->();
34 4 100       25 if($after){
35 3         6 my @ignored = $after->(@result);
36             }
37             else {
38 1         2 @result = $replace->(@result);
39             }
40 4         42 return @result;
41             }
42             else {
43 4         8 my $result = $orig->();
44 4 100       24 if($after){
45 3         8 my $ignored = $after->($result);
46             }
47             else {
48 1         2 $result = $replace->($result);
49             }
50 4         27 return $result;
51             }
52             }
53              
54             1;
55              
56             __END__