File Coverage

blib/lib/CGI/Builder.pm
Criterion Covered Total %
statement 140 150 93.3
branch 43 60 71.6
condition 16 33 48.4
subroutine 34 38 89.4
pod 11 11 100.0
total 244 292 83.5


line stmt bran cond sub pod time code
1             package CGI::Builder ;
2             $VERSION = 1.36 ;
3 3     3   22603 use strict ;
  3         6  
  3         79  
4              
5             # This file uses the "Perlish" coding style
6             # please read http://perl.4pro.net/perlish_coding_style.html
7              
8             ; use 5.006_001
9 3     3   52 ; use Carp
  3         8  
  3         90  
10 3     3   16 ; $Carp::Internal{+__PACKAGE__}++
  3         8  
  3         236  
11             ; $Carp::Internal{__PACKAGE__.'::_'}++
12             ; use IO::Util
13 3     3   6989 ; use Class::Util
  3         6678  
  3         21  
14 3     3   2048 ; use warnings::register
  3         1929  
  3         18  
15              
16 3     3   224 ; my @phase
  3         4  
  3         482  
17             ; BEGIN
18 2     2   9 { @phase = qw | CB_INIT
19             GET_PAGE
20             PRE_PROCESS
21             SWITCH_HANDLER
22             PRE_PAGE
23             PAGE_HANDLER
24             FIXUP
25             RESPONSE
26             REDIR
27             CLEANUP
28             |
29 3         176 ; no strict 'refs'
30 3     3   17 ; foreach my $i (0..$#phase)
  3         5  
  2         8  
31 20         384 { *{$phase[$i]} = sub(){$i}
  0         0  
32 20         108 }
33             }
34            
35             ; sub phase
36 0   0 0 1 0 { $phase[$_[1]||$_[0]->PHASE]
37             }
38              
39             ; sub capture
40 11     11 1 1259 { my ($s, $h, @args) = @_
41 11     11   314 ; IO::Util::capture{ $s->$h(@args) }
42 11         60 }
43              
44             ; sub import
45 11     11   20891 { my ($cbb, $CB, @ext) = (scalar caller, @_)
46 11         38 ; Class::Util::load for @ext
47 2         660 ; no strict 'refs'
48 2     2   10 ; foreach my $c (reverse @_)
  2         2  
  11         1577  
49 15 50       160 { push @{$cbb.'::ISA'}, $c unless $cbb->isa($c)
  15         172  
50             }
51 11 0 33     121 ; $cbb->isa('Apache::CGI::Builder') && $Apache::CGI::Builder::usage
52             && carp $Apache::CGI::Builder::usage
53             ; my $sub = sub
54 125         160 { +{ map
55 25     25   1409 { my $h = $_
56 275         1251 ; my @op = grep
57 125 100       385 { defined &{$_.'::OH_'.$h}
  275         268  
58             }
59             $h =~ /up$/ # ;-)
60             ? reverse ($CB, @ext, $cbb)
61             : ($CB, @ext, $cbb)
62 125 100       388 ; @op ? ($h => \@op) : ()
63             }
64             qw| init pre_process pre_page fixup cleanup |
65             }
66             }
67 11         62 ; eval qq
68 2     2   13 ! package $cbb
  2     2   3  
  2     0   16  
  2         15  
  2         4  
  2         19  
  11         913  
  0         0  
  0         0  
69             ; use Class::groups
70             { name => 'overrun_handler_map'
71             , default => \$sub
72             }
73             ; *import = sub{} unless defined &import
74             !
75             }
76              
77             ; my $exec = \&CGI::Builder::_::exec
78            
79             ; sub CGI::Builder::_::exec
80 65     65   5924 { my $s = shift
81 65         88 ; my $h = shift
82 65     32   385 ; Class::Util::gather { $s->$_(@_) } '&OH_'.$h
  32         1328  
83             , $s->overrun_handler_map($h)
84             }
85              
86             ; use Class::constr
87 2         21 ( { init => \&CGI::Builder::_::init
88             , no_strict => 1
89             }
90             )
91            
92 2     2   1776 ; sub CGI::Builder::_::init
  2         1412  
93 16     16   11168 { my $s = shift
94 0     0   0 ; local $SIG{__DIE__} = sub{$s->die_handler(@_)}
95 16         110 ; $s->$exec('init', @_)
  16         49  
96             }
97            
98 2         14 ; use Class::groups qw | overrun_handler_map
99             switch_handler_map
100             page_handler_map
101             |
102 2     2   1976 ; use Object::groups qw | param
  2         7064  
  2         19  
103             header
104             page_error
105             |
106 2     2   1977 ; use Class::props
  2         319  
107 2         22 ( { name => 'no_page_content_status'
108             , default => '204 No Content'
109             }
110             )
111            
112 2     2   230 ; use Object::props
  2         3  
113             ( { name => 'PHASE'
114             , default => CB_INIT
115             , allowed => qr/^CGI::Builder/ # only settable from CBF
116             }
117             , { name => 'cgi_page_param'
118             , default => 'p'
119             }
120             , { name => 'cgi'
121 6         238 , default => sub{ shift()->cgi_new }
122             }
123             , { name => 'page_name'
124             , default => 'index'
125             }
126             , { name => 'requested_page'
127             , allowed => qw/^CGI::Builder::process$/
128             }
129             , { name => 'page_path'
130             , default => './tm'
131             , no_strict => 1 # doesn't croak if ./tm is not a directory
132 0 0       0 , validation => sub { -d or croak "'$_' is not a directory, died" }
133             }
134 2         50 , { name => [ qw| page_content page_suffix | ]
135             , default => ''
136             }
137             , 'dont_send_header'
138             )
139              
140 2     2   6254 ; our $AUTOLOAD
  2         312  
141             ; sub AUTOLOAD : lvalue # param AUTOLOADING
142 8     8   1881 { (my $n = $AUTOLOAD) =~ s/.*://
143 8 50 33     724 ; carp qq(Use of unprefixed autoloaded parameter "$n". )
144             . qq(Autoloaded parameters should start with 'my_' or '_')
145             if warnings::enabled && $n !~ /^(?:my)?_/
146 8 100       67 ; @_ == 2
147             ? ( $_[0]{param}{$n} = $_[1] )
148             : $_[0]{param}{$n}
149             }
150            
151 0     0   0 ; sub DESTROY {}
152              
153             ; sub cgi_new
154             { require CGI
155 6     6 1 49 ; CGI->new
  6         30  
156             }
157              
158             ; sub process
159 11     11 1 21 { my ($s, $p) = @_
160 4     4   212 ; local $SIG{__DIE__} = sub{$s->die_handler(@_)}
161 11         65 ; $s->PHASE(GET_PAGE)
  11         67  
162 11 100 66     955 ; if ( defined $p && length $p )
163 3         16 { $s->requested_page($p)
164 3         269 ; $s->page_name($p)
165             }
166             else
167 8         55 { $s->requested_page( $s->get_page_name() )
168             }
169 11 50       1077 ; if ($s->PHASE < PRE_PROCESS)
170 11         295 { $s->PHASE(PRE_PROCESS)
171 11         832 ; $s->$exec('pre_process')
172             }
173 11 100       688 ; if ($s->PHASE < SWITCH_HANDLER)
174 9         254 { $s->switch_to( $s->page_name )
175             }
176 11 100       334 ; if ($s->PHASE < FIXUP)
177 10         256 { $s->PHASE(FIXUP)
178 10         746 ; $s->$exec('fixup')
179             }
180 11 100       640 ; if ($s->PHASE < RESPONSE)
181 10         259 { $s->PHASE(RESPONSE)
182 10         763 ; my $has_content = $s->page_content_check
183 10 100 66     295 ; $s->header( -status => $s->no_page_content_status )
184             unless $has_content || defined $s->header->{-status}
185 10 50       346 ; $s->send_header() unless $s->dont_send_header
186 10 100       19517 ; $s->send_content() if $has_content
187             }
188 11         113 ; $s->PHASE(CLEANUP)
189 11         902 ; $s->$exec('cleanup') # done however
190             }
191              
192             ; sub switch_to
193 15     15 1 273 { my ($s, $p) = splice @_, 0, 2
194 15 50       135 ; $s->PHASE < PRE_PROCESS && croak 'Too early to call switch_to(), died'
195 15 50       398 ; $s->PHASE > FIXUP && croak 'Too late to call switch_to(), died'
196 15 50 33     447 ; defined $p && length $p || croak 'No page_name name passed, died'
197 15         211 ; $s->page_name($p)
198 15         532 ; $s->PHASE(SWITCH_HANDLER)
199 15         1182 ; my $shm = $s->switch_handler_map
200 15   66     365 ; my $SH = $$shm{$p} || $s->can("SH_$p")
201 15 100       52 ; $s->$SH(@_) if $SH
202 15 100       1952 ; if ($s->PHASE < PRE_PAGE)
203 13         340 { $s->PHASE(PRE_PAGE)
204 13         1001 ; $s->$exec('pre_page')
205             }
206 15 100       791 ; if ($s->PHASE < PAGE_HANDLER)
207 13         354 { $s->PHASE(PAGE_HANDLER)
208 13         1039 ; my $phm = $s->page_handler_map
209 13   66     301 ; my $PH = $$phm{$p} || $s->can("PH_$p")
210             || ! $s->page_content_check
211             && ($$phm{AUTOLOAD} || $s->can('PH_AUTOLOAD'))
212 13 100       176 ; $s->$PH(@_) if $PH
213             }
214             }
215              
216             ; sub get_page_name
217 8     8 1 13 { my $s = shift
218 8         33 ; my $p = $s->cgi->param($s->cgi_page_param)
219 8 100 66     2874 ; $s->page_name($p) if defined($p) && length($p)
220             }
221              
222             ; sub page_content_check
223 12     12 1 37 { length $_[0]->page_content
224             }
225            
226             ; sub send_header
227 10     10 1 181 { print $_[0]->cgi->header( %{$_[0]->header} )
  10         187  
228             }
229              
230             ; sub send_content
231 7     7 1 27 { my $pc = $_[0]->page_content
232 7 50       223 ; if ( ref $pc eq 'CODE' )
    50          
    50          
233 0         0 { $_[0]->$pc
234             }
235             elsif ( ref $pc eq 'SCALAR' )
236 0         0 { print $$pc
237             }
238             elsif ( not ref $pc )
239 7         19 { print $pc
240             }
241             }
242              
243             ; sub redirect
244 1     1 1 11 { my ($s, $url) = @_
245 1 50       15 ; $s->PHASE < GET_PAGE && croak 'Too early to call redirect(), died'
246 1 50       34 ; $s->PHASE > RESPONSE && croak 'Too late to call redirect(), died'
247 1 50 33     37 ; defined $url && length $url || croak 'No URL passed, died'
248 1         5 ; $s->PHASE(REDIR)
249 1         90 ; $s->header(-url => $url)
250 1         43 ; print $s->cgi->redirect( %{$s->header} )
  1         21  
251             }
252              
253             ; sub die_handler
254 4     4 1 9 { my ( $s, $msg ) = @_
255 4         32 ; for ( my $i = 1
256             ; my $sub = (caller($i))[3]
257             ; $i++
258             )
259 8 100 66     96 { die $msg if $sub eq '(eval)' && (caller($i+1))[3]
260             }
261 0           ; die sprintf 'Fatal error in phase %s for page "%s": %s'
262             , $s->phase
263             , $s->page_name
264             , $msg
265             }
266            
267             ; 1
268              
269             __END__