File Coverage

blib/lib/Devel/Examine/Subs/Postprocessor.pm
Criterion Covered Total %
statement 114 114 100.0
branch 36 42 85.7
condition 9 9 100.0
subroutine 21 21 100.0
pod 4 6 66.6
total 184 192 95.8


line stmt bran cond sub pod time code
1             package Devel::Examine::Subs::Postprocessor;
2 57     57   945 use 5.008;
  57         176  
3 57     57   370 use strict;
  57         92  
  57         1240  
4 57     57   271 use warnings;
  57         97  
  57         2161  
5              
6             our $VERSION = '1.61';
7              
8 57     57   340 use Carp;
  57         86  
  57         3256  
9 57     57   276 use Data::Dumper;
  57         113  
  57         6227  
10              
11             BEGIN {
12              
13             # we need to do some trickery for DTS due to circular referencing,
14             # which broke CPAN installs.
15              
16 57     57   134 eval {
17 57         19737 require Devel::Trace::Subs;
18             };
19              
20 57         206 eval {
21 57         239 import Devel::Trace::Subs qw(trace);
22             };
23              
24 57 50       290 if (! defined &trace){
25 57     8   62274 *trace = sub {};
26             }
27             };
28              
29             sub new {
30            
31 142 100   142 0 2100 trace() if $ENV{TRACE};
32              
33 141         277 my $self = {};
34 141         337 bless $self, shift;
35              
36 141         222 my $struct = shift;
37              
38 141         443 $self->{post_procs} = $self->_dt();
39              
40 141         420 return $self;
41             }
42             sub _dt {
43            
44 145 100   145   1361 trace() if $ENV{TRACE};
45              
46 144         268 my $self = shift;
47              
48 144         1235 my $dt = {
49             file_lines_contain => \&file_lines_contain,
50             subs => \&subs,
51             objects => \&objects,
52             _default => \&_default,
53             _test => \&_test,
54             _test_bad => \&_test_bad,
55             end_of_last_sub => \&end_of_last_sub,
56             };
57              
58 144         562 return $dt;
59             }
60             sub exists {
61            
62 138 100   138 1 1429 trace() if $ENV{TRACE};
63              
64 137         236 my $self = shift;
65 137         226 my $string = shift;
66              
67 137 100       452 if (exists $self->{post_procs}{$string}){
68 133         524 return 1;
69             }
70             else {
71 4         41 return 0;
72             }
73             }
74             sub subs {
75            
76 44 100   44 1 2911 trace() if $ENV{TRACE};
77            
78             return sub {
79            
80 41 50   41   141 trace() if $ENV{TRACE};
81              
82 41         76 my $p = shift;
83 41         65 my $struct = shift;
84            
85 41         72 my $s = $struct;
86 41         60 my @subs;
87              
88 41         142 for my $f (keys %$s){
89            
90 40         63 for my $sub (keys %{$s->{$f}{subs}}){
  40         226  
91 341         606 $s->{$f}{subs}{$sub}{start}++;
92 341         547 $s->{$f}{subs}{$sub}{end}++;
93 341         695 $s->{$f}{subs}{$sub}{name} = $sub;
94 341         399 @{ $s->{$f}{subs}{$sub}{code} } = @{ $s->{$f}{subs}{$sub}{code} };
  341         1994  
  341         697  
95 341         1027 push @subs, $s->{$f}{subs}{$sub};
96             }
97             }
98 41         147 return \@subs;
99 43         304 };
100             }
101             sub file_lines_contain {
102            
103 71 100   71 1 1438 trace() if $ENV{TRACE};
104              
105             return sub {
106            
107 69 100   69   238 trace() if $ENV{TRACE};
108              
109 69         115 my $p = shift;
110 69         116 my $struct = shift;
111              
112 69         162 my $search = $p->{search};
113              
114 69 100 100     413 if ($search && ! $p->{regex}){
115 4         13 $search = "\Q$search";
116             }
117              
118 69         129 my $s = $struct;
119              
120 69 100       221 if (not $search){
121 26         83 return $struct;
122             }
123              
124 43         158 for my $f (keys %$s){
125 43         67 for my $sub (keys %{$s->{$f}{subs}}){
  43         225  
126 413         534 my $found = 0;
127 413         492 my @has;
128 413         487 for (@{$s->{$f}{subs}{$sub}{code}}){
  413         1238  
129 2138 100 100     10268 if ($_ and /$search/){
130 171         219 $found++;
131 171         379 push @has, $_;
132             }
133             }
134 413 100       925 if (! $found){
135 253         772 delete $s->{$f}{subs}{$sub};
136 253         512 next;
137             }
138 160         588 $s->{$f}{subs}{$sub}{code} = \@has;
139             }
140             }
141 43         157 return $struct;
142 70         528 };
143             }
144             sub end_of_last_sub {
145            
146 6 100   6 1 1728 trace() if $ENV{TRACE};
147            
148             return sub {
149            
150 4 50   4   18 trace() if $ENV{TRACE};
151            
152 4         9 my $p = shift;
153 4         8 my $struct = shift;
154              
155 4         6 my @last_line_nums;
156              
157 4         13 for my $sub (@$struct){
158 43         79 push @last_line_nums, $sub->{end};
159             }
160              
161 4         30 @last_line_nums = sort {$a<=>$b} @last_line_nums;
  100         138  
162              
163 4         18 return $last_line_nums[-1];
164              
165 5         42 };
166             }
167             sub _test {
168            
169 4 100   4   920 trace() if $ENV{TRACE};
170              
171             return sub {
172            
173 1 50   1   4 trace() if $ENV{TRACE};
174 1         3 my $p = shift;
175 1         1 my $struct = shift;
176 1         4 return $struct;
177 3         25 };
178             }
179             sub objects {
180            
181 18 100   18 0 964 trace() if $ENV{TRACE};
182              
183             # uses 'subs' post_proc
184              
185             return sub {
186            
187 16 50   16   57 trace() if $ENV{TRACE};
188              
189 16         29 my $p = shift;
190 16         27 my $struct = shift;
191              
192 16         24 my @return;
193              
194 16 50       59 return if not ref($struct) eq 'ARRAY';
195              
196 16         36 my $file = $p->{file};
197 16         31 my $search = $p->{search};
198              
199 16 100 100     76 if ($search && ! $p->{regex}){
200 1         3 $search = "\Q$search";
201             }
202              
203 16         26 my $lines;
204              
205             my $des_sub;
206              
207 16         37 for my $sub (@$struct){
208              
209             $des_sub
210 91         379 = Devel::Examine::Subs::Sub->new($sub, $sub->{name});
211              
212 91         178 push @return, $des_sub;
213             }
214              
215 16         55 return \@return;
216 17         115 };
217             }
218 1     1   5 sub _vim_placeholder {1;}
219             1;
220             __END__