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   111329 use strict;
  20         24  
  20         509  
4 20     20   64 use warnings;
  20         23  
  20         462  
5 20     20   739 use Data::Util ();
  20         20  
  20         4755  
6              
7             sub import{
8 6     6   2723 my $class = shift;
9 6 100       33 $class->fail_handler(scalar(caller) => @_) if @_;
10             }
11              
12             my %FailHandler;
13             sub fail_handler :method{
14 159     159 1 1103 shift; # this class
15              
16 159         127 my $pkg = shift;
17 159         170 my $h = $FailHandler{$pkg}; # old handler
18              
19 159 100       236 if(@_){ # set
20 6         26 $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       7123 require mro if $] >= 5.011_000;
25              
26 153         9430 foreach my $p(@{mro::get_linear_isa($pkg)}){
  153         495  
27 157 100       341 if(defined( $h = $FailHandler{$p} )){
28 12         12 last;
29             }
30             }
31             }
32              
33              
34 157         273 return $h;
35             }
36              
37             sub croak{
38 147     147 1 48556 require Carp;
39              
40 147         131 my $caller_pkg;
41 147         143 my $i = 0;
42 147         275 while( defined( $caller_pkg = caller $i) ){
43 301 100       7827 if($caller_pkg ne 'Data::Util'){
44 147         158 last;
45             }
46 154         232 $i++;
47             }
48              
49 147         314 my $fail_handler = __PACKAGE__->fail_handler($caller_pkg);
50              
51 147         147 local $Carp::CarpLevel = $Carp::CarpLevel + $i;
52 147 100       1383 die $fail_handler ? &{$fail_handler} : &Carp::longmess;
  6         12  
53             }
54             1;
55             __END__