File Coverage

blib/lib/Plack/Middleware/EnvTracer.pm
Criterion Covered Total %
statement 63 63 100.0
branch 12 12 100.0
condition 6 8 75.0
subroutine 17 17 100.0
pod 2 2 100.0
total 100 102 98.0


line stmt bran cond sub pod time code
1             package Plack::Middleware::EnvTracer;
2 9     9   73711 use strict;
  9         28  
  9         263  
3 9     9   47 use warnings;
  9         20  
  9         263  
4 9     9   522 use parent 'Plack::Middleware';
  9         327  
  9         56  
5 9     9   16132 use Plack::Util::Accessor qw/methods callback/;
  9         23  
  9         83  
6              
7             our $VERSION = '0.03';
8              
9             my $ENABLE = +{};
10              
11             sub prepare_app {
12 9     9 1 6514 my $self = shift;
13              
14 9 100 66     31 if ( ref $self->methods eq 'ARRAY' && scalar(@{$self->methods}) > 0 ) {
  1         46  
15 1         8 map { $ENABLE->{lc($_)} = 1; } @{$self->methods};
  1         8  
  1         3  
16             }
17             else {
18 8         338 map { $ENABLE->{$_} = 1; } qw/
  64         142  
19             fetch store exists delete clear scalar firstkey nextkey
20             /;
21             }
22              
23 9 100 66     28 if (!$self->callback || ref $self->callback ne 'CODE') {
24             $self->callback(sub {
25 8     8   63 my ($summary, $trace) = @_;
26 8         600 print "$summary\n$trace\n";
27 8         80 });
28             }
29              
30 9         92 tie %ENV, __PACKAGE__;
31             }
32              
33             my @TRACE_LOG;
34             my %COUNT;
35              
36             sub call {
37 9     9 1 195247 my($self, $env, $panel) = @_;
38              
39 9         34 @TRACE_LOG = ();
40 9         88 %COUNT = ();
41              
42 9         109 my $res = $self->app->($env);
43              
44 9         90 my @summary;
45 9         36 for my $i (qw/ fetch store exists delete clear scalar firstkey nextkey /) {
46 72         139 my $j = uc $i;
47             push @summary, sprintf(
48             "$j:%s",
49 72 100 100     375 $ENABLE->{$i} ? ($COUNT{$j} || 0) : '-'
50             );
51             }
52              
53 9         85 $self->callback->(
54             join(", ", @summary),
55             join("\n", @TRACE_LOG),
56             );
57              
58 9         188 return $res;
59             }
60              
61             sub TIEHASH {
62 9     9   227 return bless +{ %ENV }, shift;
63             }
64              
65             sub FETCH {
66 58     58   3729 _tracer('FETCH', $_[1], undef, caller() );
67 58         1007 $_[0]->{$_[1]};
68             }
69              
70             sub STORE {
71 10     10   206 _tracer('STORE', $_[1], $_[2], caller() );
72 10         48 $_[0]->{$_[1]} = $_[2];
73             }
74              
75             sub EXISTS {
76 5     5   64 _tracer('EXISTS', $_[1], undef, caller() );
77 5         23 return exists($_[0]->{$_[1]});
78             }
79              
80             sub DELETE {
81 1     1   11 _tracer('DELETE', $_[1], undef, caller() );
82 1         5 delete $_[0]->{$_[1]};
83             }
84              
85             sub CLEAR {
86 1     1   22 _tracer('CLEAR', undef, undef, caller() );
87 1         3 %{$_[0]} = ();
  1         13  
88             }
89              
90             sub SCALAR {
91 1     1   18 _tracer('SCALAR', undef, undef, caller() );
92 1         2 scalar %{$_[0]};
  1         4  
93             }
94              
95             sub FIRSTKEY {
96 2     2   23 _tracer('FIRSTKEY', undef, undef, caller() );
97 2         4 my $a = scalar keys %{$_[0]};
  2         8  
98 2         8 each %{$_[0]};
  2         13  
99             }
100              
101             sub NEXTKEY {
102 59     59   179 _tracer('NEXTKEY', undef, undef, caller() );
103 59         89 each %{$_[0]};
  59         246  
104             }
105              
106             sub _tracer {
107 137     137   306 my ($method, $key, $value,
108             $package, $filename, $line) = @_;
109              
110 137 100       357 return unless $ENABLE->{lc($method)};
111              
112 133 100       314 $key = !defined $key ? '' : defined $value ? "$key=$value" : $key;
    100          
113 133         543 push @TRACE_LOG, "PID:$$\t$method\t$key\t[$filename#$line]";
114              
115 133         290 $COUNT{$method}++;
116             }
117              
118             1;
119              
120             __END__