| 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__ |