File Coverage

blib/lib/Data/Util/Error.pm
Criterion Covered Total %
statement 34 34 100.0
branch 12 14 85.7
condition n/a
subroutine 6 6 100.0
pod 2 2 100.0
total 54 56 96.4


line stmt bran cond sub pod time code
1             package Data::Util::Error;
2              
3 20     20   107236 use strict;
  20         27  
  20         512  
4 20     20   61 use warnings;
  20         21  
  20         475  
5 20     20   664 use Data::Util ();
  20         20  
  20         5037  
6              
7             sub import{
8 6     6   3244 my $class = shift;
9 6 100       34 $class->fail_handler(scalar(caller) => @_) if @_;
10             }
11              
12             my %FailHandler;
13             sub fail_handler :method{
14 159     159 1 1189 shift; # this class
15              
16 159         134 my $pkg = shift;
17 159         161 my $h = $FailHandler{$pkg}; # old handler
18              
19 159 100       221 if(@_){ # set
20 6         29 $FailHandler{$pkg} = Data::Util::code_ref(shift);
21             }
22             else{ # get
23 153 50       256 require MRO::Compat if $] < 5.010_000;
24 153 50       7046 require mro if $] >= 5.011_000;
25              
26 153         10053 foreach my $p(@{mro::get_linear_isa($pkg)}){
  153         466  
27 157 100       319 if(defined( $h = $FailHandler{$p} )){
28 12         13 last;
29             }
30             }
31             }
32              
33              
34 157         261 return $h;
35             }
36              
37             sub croak{
38 147     147 1 39616 require Carp;
39              
40 147         123 my $caller_pkg;
41 147         137 my $i = 0;
42 147         302 while( defined( $caller_pkg = caller $i) ){
43 301 100       6239 if($caller_pkg ne 'Data::Util'){
44 147         139 last;
45             }
46 154         209 $i++;
47             }
48              
49 147         315 my $fail_handler = __PACKAGE__->fail_handler($caller_pkg);
50              
51 147         142 local $Carp::CarpLevel = $Carp::CarpLevel + $i;
52 147 100       1274 die $fail_handler ? &{$fail_handler} : &Carp::longmess;
  6         11  
53             }
54             1;
55             __END__