File Coverage

blib/lib/Devel/TrackSIG.pm
Criterion Covered Total %
statement 32 49 65.3
branch 4 14 28.5
condition n/a
subroutine 8 11 72.7
pod 2 2 100.0
total 46 76 60.5


line stmt bran cond sub pod time code
1             package Devel::TrackSIG;
2 1     1   13204 use strict;
  1         1  
  1         28  
3 1     1   3 use warnings;
  1         1  
  1         19  
4 1     1   3 use Carp;
  1         4  
  1         481  
5 1     1   350 eval "use Carp::Heavy;";
  1         97  
  1         12  
6             require Tie::Hash;
7             our @ISA = qw(Tie::ExtraHash);
8              
9             our $VERSION = '0.04';
10              
11             tie %main::SIG => __PACKAGE__;
12              
13             our %opt = (
14             track_source => 1,
15             report_write_access => 0,
16             );
17              
18             sub import {
19 1     1   4 my $class = shift;
20 1         2 my %args = @_;
21              
22 1         22 $opt{$_} = $args{$_} for keys %args;
23             }
24              
25              
26             sub DELETE {
27 10     10   324 _report($_[0], $_[1], 'DELETE');
28 10         681 return delete $_[0]->[0]->{$_[1]};
29             }
30              
31             sub STORE {
32 5     5   85 _report($_[0], $_[1], 'STORE');
33 5         122 return $_[0]->[0]->{$_[1]} = $_[2];
34             }
35              
36             sub CLEAR {
37 0     0   0 _report($_[0], '', 'CLEAR');
38 0         0 %{$_[0]->[0]} = ();
  0         0  
39             }
40              
41              
42             sub _report {
43 15     15   14 my $obj = shift;
44 15         14 my $key = shift;
45 15         10 my $action = shift;
46              
47            
48 15 100       28 push @$obj, {} if @$obj < 2;
49              
50 15         14 my $sources = $obj->[1];
51              
52 15         10 my $msg = do {
53 15         10 my $i;
54             my @stack;
55 15         86 while ( my @caller = caller $i++ ) {
56 157         759 push @stack, sprintf ' %s::%s called at %s line %s', @caller[0,3,1,2];
57             }
58 15         84 "${action}ing signal handler '$key' at\n" . join("\n", @stack );
59             };
60              
61 15 50       29 if ($opt{track_source}) {
62 15         23 $sources->{$key} = $msg;
63             }
64 15 50       26 if ($opt{report_write_access}) {
65 0           print STDERR $msg . "\n";
66             }
67             }
68              
69             sub get_source {
70 0     0 1   my $self = shift;
71 0           my $key = shift;
72 0 0         print STDERR "Source tracking not enabled. Pass the track_source => 1 option when loading TrackSIG to enable\n"
73             if not $opt{track_source};
74 0 0         return '' if not @{$self} > 1;
  0            
75 0           return $self->[1]->{$key};
76             }
77              
78             sub dump_all_sources {
79 0     0 1   my $self = shift;
80 0 0         print STDERR "Source tracking not enabled. Pass the track_source => 1 option when loading TrackSIG to enable\n"
81             if not $opt{track_source};
82 0 0         return if not @{$self} > 1;
  0            
83 0           my $sources = $self->[1];
84 0           foreach my $key (keys %$sources) {
85 0           print STDERR "\$SIG{$key} was last set at:\n" . $sources->{$key} . "\n\n";
86             }
87             }
88              
89             1;
90              
91             __END__