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