line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
1
|
|
|
|
|
|
|
package Template::Provider::Preload; |
2
|
|
|
|
|
|
|
|
3
|
|
|
|
|
|
|
=pod |
4
|
|
|
|
|
|
|
|
5
|
|
|
|
|
|
|
=head1 NAME |
6
|
|
|
|
|
|
|
|
7
|
|
|
|
|
|
|
Template::Provider::Preload - Preload templates to save memory when forking |
8
|
|
|
|
|
|
|
|
9
|
|
|
|
|
|
|
=head1 SYNOPSIS |
10
|
|
|
|
|
|
|
|
11
|
|
|
|
|
|
|
my $template = Template->new( |
12
|
|
|
|
|
|
|
LOAD_TEMPLATES => [ |
13
|
|
|
|
|
|
|
Template::Provider::Preload->new( |
14
|
|
|
|
|
|
|
PRECACHE => 1, |
15
|
|
|
|
|
|
|
PREFETCH => '*.tt', |
16
|
|
|
|
|
|
|
INCLUDE_PATH => 'my/templates', |
17
|
|
|
|
|
|
|
COMPILE_DIR => 'my/cache', |
18
|
|
|
|
|
|
|
|
19
|
|
|
|
|
|
|
# Parser options should go here instead of to the |
20
|
|
|
|
|
|
|
# parent Template constructor. |
21
|
|
|
|
|
|
|
INTERPOLATE => 1, |
22
|
|
|
|
|
|
|
PRE_CHOMP => 1, |
23
|
|
|
|
|
|
|
); |
24
|
|
|
|
|
|
|
], |
25
|
|
|
|
|
|
|
); |
26
|
|
|
|
|
|
|
|
27
|
|
|
|
|
|
|
=head1 DESCRIPTION |
28
|
|
|
|
|
|
|
|
29
|
|
|
|
|
|
|
One of the nicer things that the Template Toolkit modules do in the default |
30
|
|
|
|
|
|
|
L is provide two powerful caching features. |
31
|
|
|
|
|
|
|
|
32
|
|
|
|
|
|
|
The first is to cache the result of the slow and expensive compilation |
33
|
|
|
|
|
|
|
phase, storing the Perl version of the template in a specific cache |
34
|
|
|
|
|
|
|
directory. This mechanism is disabled by default, and enabled with |
35
|
|
|
|
|
|
|
the C parameter. |
36
|
|
|
|
|
|
|
|
37
|
|
|
|
|
|
|
The second is that the compiled templates will be cached in memory the |
38
|
|
|
|
|
|
|
first time they are used, based on template path. This feature is enabled |
39
|
|
|
|
|
|
|
by default and permitted to grow to infinite size. It can be limited or |
40
|
|
|
|
|
|
|
disabled via the C param. |
41
|
|
|
|
|
|
|
|
42
|
|
|
|
|
|
|
The default cache strategy works just fine in a single-process application, |
43
|
|
|
|
|
|
|
and in fact in many such cases is the optimum caching strategy. |
44
|
|
|
|
|
|
|
|
45
|
|
|
|
|
|
|
However, the default cache strategy can perform horribly in several |
46
|
|
|
|
|
|
|
situations relating to large-scale and high-demand applications. |
47
|
|
|
|
|
|
|
|
48
|
|
|
|
|
|
|
B can be used to create caching strategies |
49
|
|
|
|
|
|
|
that are more appropriate for heavily forking applications such as |
50
|
|
|
|
|
|
|
clustered high-traffic mod_perl systems. |
51
|
|
|
|
|
|
|
|
52
|
|
|
|
|
|
|
=head1 USE CASES |
53
|
|
|
|
|
|
|
|
54
|
|
|
|
|
|
|
While B is useful in many high-forking |
55
|
|
|
|
|
|
|
scenarios, we will use the (dominant) case of a forking Apache |
56
|
|
|
|
|
|
|
application in all of the following examples. You should be able to |
57
|
|
|
|
|
|
|
exchange all uses of terms like "Apache child" with your equivalent |
58
|
|
|
|
|
|
|
interchangably. |
59
|
|
|
|
|
|
|
|
60
|
|
|
|
|
|
|
=head2 High-Security Server |
61
|
|
|
|
|
|
|
|
62
|
|
|
|
|
|
|
In some very high security environments, the web user will not have the |
63
|
|
|
|
|
|
|
right to create any files whatsoever, including temporary files. |
64
|
|
|
|
|
|
|
|
65
|
|
|
|
|
|
|
This prevents the use of the compilation cache, and the template update |
66
|
|
|
|
|
|
|
checks in the provider greatly complicate the possibility of building |
67
|
|
|
|
|
|
|
the cache in advance offsite. |
68
|
|
|
|
|
|
|
|
69
|
|
|
|
|
|
|
By allowing all templates to be compiled to memory in advance, you can |
70
|
|
|
|
|
|
|
use templates at their full speed without the penalty of parsing and |
71
|
|
|
|
|
|
|
compiling every template once per Apache child process. |
72
|
|
|
|
|
|
|
|
73
|
|
|
|
|
|
|
Most of the following cases also assume a well-control static production |
74
|
|
|
|
|
|
|
environment, where the template content will not change (and a web server |
75
|
|
|
|
|
|
|
restart is done each time a new version of the application is deployed). |
76
|
|
|
|
|
|
|
|
77
|
|
|
|
|
|
|
=head2 Large Templates, Many Templates |
78
|
|
|
|
|
|
|
|
79
|
|
|
|
|
|
|
Under the default cache strategy (with a compilation directory enabled) |
80
|
|
|
|
|
|
|
the first Apache child that uses each template will compile and cache |
81
|
|
|
|
|
|
|
the template. Each Apache child that uses the templates will then need |
82
|
|
|
|
|
|
|
to separately load the compiled templates into memory. |
83
|
|
|
|
|
|
|
|
84
|
|
|
|
|
|
|
With web servers often having 20 or 50 or 100 child processes each, |
85
|
|
|
|
|
|
|
templates that expand into 10 meg of memory for a single process |
86
|
|
|
|
|
|
|
(which can be quite possible with a reasonable number of templates) can |
87
|
|
|
|
|
|
|
easily expand into a gigabyte of memory that contributes nothing other |
88
|
|
|
|
|
|
|
than to eat into your more useful object or disk caches. |
89
|
|
|
|
|
|
|
|
90
|
|
|
|
|
|
|
With large numbers of large templates on multi-core servers with many |
91
|
|
|
|
|
|
|
many child processes, you can even put yourself in the situation of |
92
|
|
|
|
|
|
|
needing to requisition additional web servers due to memory contraints, |
93
|
|
|
|
|
|
|
rather than CPU constraints. |
94
|
|
|
|
|
|
|
|
95
|
|
|
|
|
|
|
Memory saved by loading a template once instead of 100 times can be |
96
|
|
|
|
|
|
|
retasked to enable higher throughput (by providing more children) or |
97
|
|
|
|
|
|
|
reduced latency (by boosting various caches). |
98
|
|
|
|
|
|
|
|
99
|
|
|
|
|
|
|
=head2 Networked Templates |
100
|
|
|
|
|
|
|
|
101
|
|
|
|
|
|
|
In cluster environments where all front-end servers will use a common |
102
|
|
|
|
|
|
|
back-end Network-Attached Storage to store the website, reducing the number, |
103
|
|
|
|
|
|
|
frequency and size of disk interations (both reads and stats) is an |
104
|
|
|
|
|
|
|
important element in reducing or eliminating disk contention and network |
105
|
|
|
|
|
|
|
load on what is often a critical shared resource. |
106
|
|
|
|
|
|
|
|
107
|
|
|
|
|
|
|
Reducing the number of template-related requests serves a triple purpose of |
108
|
|
|
|
|
|
|
reducing the size, speed, capacity and cost of required networking |
109
|
|
|
|
|
|
|
equipment, allowing additional front-end server growth with lower change of |
110
|
|
|
|
|
|
|
requiring (highly disruptive) upgrades to central network or storage kit, |
111
|
|
|
|
|
|
|
and eliminating high-latency network IO requests from the web pipeline. |
112
|
|
|
|
|
|
|
|
113
|
|
|
|
|
|
|
By compiling and loading all of the common templates in advance into a |
114
|
|
|
|
|
|
|
seperate pre-fork memory cache (hereafter "precache") you can create an |
115
|
|
|
|
|
|
|
environment in which the individual Apache children will not need issue |
116
|
|
|
|
|
|
|
network filesystem requests except in the case of rare and unusual website |
117
|
|
|
|
|
|
|
requests that load rarely used templates. |
118
|
|
|
|
|
|
|
|
119
|
|
|
|
|
|
|
This can be taken to the extreme by loading every possible template into |
120
|
|
|
|
|
|
|
the precache, which will eliminate template entirely and enable more-unusual |
121
|
|
|
|
|
|
|
tricks like allowing the web server to disconnect entirely from the |
122
|
|
|
|
|
|
|
source of the templates. |
123
|
|
|
|
|
|
|
|
124
|
|
|
|
|
|
|
=head1 FEATURES |
125
|
|
|
|
|
|
|
|
126
|
|
|
|
|
|
|
B provides two additional caching features |
127
|
|
|
|
|
|
|
that can be used on their own to implement the most common caching strategy, |
128
|
|
|
|
|
|
|
or in combination with the default cache settings to allow for more varied |
129
|
|
|
|
|
|
|
and subtle caching strategies. |
130
|
|
|
|
|
|
|
|
131
|
|
|
|
|
|
|
=head2 Template Search and Compilation |
132
|
|
|
|
|
|
|
|
133
|
|
|
|
|
|
|
B provides the C method that can be |
134
|
|
|
|
|
|
|
used to search the template include path and compile/load templates in bulk. |
135
|
|
|
|
|
|
|
|
136
|
|
|
|
|
|
|
The set of templates to load can be defined very flexibly, allowing you to |
137
|
|
|
|
|
|
|
preload templates at various levels. Typical examples might be loading the |
138
|
|
|
|
|
|
|
entire template library, loading only the common include templates (page |
139
|
|
|
|
|
|
|
headers and footers etc), or loading all templates accessible by the public |
140
|
|
|
|
|
|
|
while not loading rarely used staff or administration templates. |
141
|
|
|
|
|
|
|
|
142
|
|
|
|
|
|
|
=head2 Secondary Pre-Fork Cache |
143
|
|
|
|
|
|
|
|
144
|
|
|
|
|
|
|
B adds an optional third cache that sits |
145
|
|
|
|
|
|
|
between the disk compilation cache and the run-time memory cache. |
146
|
|
|
|
|
|
|
|
147
|
|
|
|
|
|
|
The precache is designed to cache templates in memory separately from |
148
|
|
|
|
|
|
|
the run-time memory cache. Holding pre-fork templates in a separate |
149
|
|
|
|
|
|
|
cache allows the normal cache to behave appropriately at run-time for |
150
|
|
|
|
|
|
|
templates that aren't in the precache, without being distracted by the |
151
|
|
|
|
|
|
|
precache entries and without having to stat the precache templates |
152
|
|
|
|
|
|
|
|
153
|
|
|
|
|
|
|
=head1 METHODS |
154
|
|
|
|
|
|
|
|
155
|
|
|
|
|
|
|
=cut |
156
|
|
|
|
|
|
|
|
157
|
3
|
|
|
3
|
|
185896
|
use 5.006; |
|
3
|
|
|
|
|
10
|
|
|
3
|
|
|
|
|
103
|
|
158
|
3
|
|
|
3
|
|
16
|
use strict; |
|
3
|
|
|
|
|
6
|
|
|
3
|
|
|
|
|
90
|
|
159
|
3
|
|
|
3
|
|
25
|
use warnings; |
|
3
|
|
|
|
|
6
|
|
|
3
|
|
|
|
|
81
|
|
160
|
3
|
|
|
3
|
|
2860
|
use Params::Util (); |
|
3
|
|
|
|
|
9356
|
|
|
3
|
|
|
|
|
71
|
|
161
|
3
|
|
|
3
|
|
1020
|
use Template::Provider (); |
|
3
|
|
|
|
|
16787
|
|
|
3
|
|
|
|
|
55
|
|
162
|
3
|
|
|
3
|
|
2989
|
use File::Find::Rule (); |
|
3
|
|
|
|
|
27454
|
|
|
3
|
|
|
|
|
140
|
|
163
|
|
|
|
|
|
|
use Class::Adapter::Builder |
164
|
3
|
|
|
|
|
25
|
ISA => 'Template::Provider', |
165
|
3
|
|
|
3
|
|
3413
|
AUTOLOAD => 1; |
|
3
|
|
|
|
|
8418
|
|
166
|
|
|
|
|
|
|
|
167
|
3
|
|
|
3
|
|
1753
|
use vars qw{$VERSION}; |
|
3
|
|
|
|
|
8
|
|
|
3
|
|
|
|
|
117
|
|
168
|
|
|
|
|
|
|
BEGIN { |
169
|
3
|
|
|
3
|
|
2029
|
$VERSION = '0.05'; |
170
|
|
|
|
|
|
|
} |
171
|
|
|
|
|
|
|
|
172
|
|
|
|
|
|
|
|
173
|
|
|
|
|
|
|
|
174
|
|
|
|
|
|
|
|
175
|
|
|
|
|
|
|
|
176
|
|
|
|
|
|
|
##################################################################### |
177
|
|
|
|
|
|
|
# Constructor |
178
|
|
|
|
|
|
|
|
179
|
|
|
|
|
|
|
=pod |
180
|
|
|
|
|
|
|
|
181
|
|
|
|
|
|
|
=head2 new |
182
|
|
|
|
|
|
|
|
183
|
|
|
|
|
|
|
my $provider = Template::Provider::Preload->new( |
184
|
|
|
|
|
|
|
PRECACHE => 1, |
185
|
|
|
|
|
|
|
PREFETCH => '*.tt', |
186
|
|
|
|
|
|
|
INCLUDE_PATH => 'my/templates', |
187
|
|
|
|
|
|
|
COMPILE_DIR => 'my/cache', |
188
|
|
|
|
|
|
|
); |
189
|
|
|
|
|
|
|
|
190
|
|
|
|
|
|
|
The C constructor accepts all the same parameters as the underlying |
191
|
|
|
|
|
|
|
L class, with two additions. |
192
|
|
|
|
|
|
|
|
193
|
|
|
|
|
|
|
The C param indicates that the secondary prefetch cache should |
194
|
|
|
|
|
|
|
be created and used for this provider. The precatch is not |
195
|
|
|
|
|
|
|
size-constrained by the C param, that option only affects |
196
|
|
|
|
|
|
|
the default run-time cache. |
197
|
|
|
|
|
|
|
|
198
|
|
|
|
|
|
|
The C param indicates that an immediate C request |
199
|
|
|
|
|
|
|
should be made at constructor time to pre-populate the cache (the |
200
|
|
|
|
|
|
|
precache if it exists, or the run-time cache otherwise) with a specified |
201
|
|
|
|
|
|
|
set of templates. |
202
|
|
|
|
|
|
|
|
203
|
|
|
|
|
|
|
The value of C can be either a single string or a |
204
|
|
|
|
|
|
|
L object, which will be passed to prefetch. |
205
|
|
|
|
|
|
|
Alternatively, if the C param is an C reference, |
206
|
|
|
|
|
|
|
the reference will be flattened to a list, allowing you to provide more |
207
|
|
|
|
|
|
|
than one file type string to C. |
208
|
|
|
|
|
|
|
|
209
|
|
|
|
|
|
|
Returns a L object, or throws an excpetion |
210
|
|
|
|
|
|
|
(dies) on error. |
211
|
|
|
|
|
|
|
|
212
|
|
|
|
|
|
|
=cut |
213
|
|
|
|
|
|
|
|
214
|
|
|
|
|
|
|
sub new { |
215
|
2
|
|
|
2
|
1
|
3657
|
my $class = shift; |
216
|
2
|
|
|
|
|
15
|
my %param = @_; |
217
|
2
|
|
|
|
|
6
|
my $precache = delete $param{PRECACHE}; |
218
|
2
|
|
|
|
|
7
|
my $prefetch = delete $param{PREFETCH}; |
219
|
|
|
|
|
|
|
|
220
|
|
|
|
|
|
|
# Create the provider as normal |
221
|
2
|
|
|
|
|
32
|
my $self = $class->SUPER::new( |
222
|
|
|
|
|
|
|
Template::Provider->new(%param), |
223
|
|
|
|
|
|
|
); |
224
|
|
|
|
|
|
|
|
225
|
|
|
|
|
|
|
# Create the precache if needed |
226
|
2
|
100
|
|
|
|
275
|
if ( $precache ) { |
227
|
1
|
|
|
|
|
7
|
$self->{PRECACHE} = {}; |
228
|
|
|
|
|
|
|
} |
229
|
|
|
|
|
|
|
|
230
|
|
|
|
|
|
|
# Prefetch immediately if needed |
231
|
2
|
50
|
|
|
|
8
|
if ( defined $prefetch ) { |
232
|
0
|
0
|
|
|
|
0
|
my @args = Params::Util::_ARRAYLIKE($prefetch) |
233
|
|
|
|
|
|
|
? ( @$prefetch ) |
234
|
|
|
|
|
|
|
: ( $prefetch ); |
235
|
0
|
|
|
|
|
0
|
$self->prefetch( @args ); |
236
|
|
|
|
|
|
|
} |
237
|
|
|
|
|
|
|
|
238
|
2
|
|
|
|
|
9
|
return $self; |
239
|
|
|
|
|
|
|
} |
240
|
|
|
|
|
|
|
|
241
|
|
|
|
|
|
|
|
242
|
|
|
|
|
|
|
|
243
|
|
|
|
|
|
|
|
244
|
|
|
|
|
|
|
|
245
|
|
|
|
|
|
|
##################################################################### |
246
|
|
|
|
|
|
|
# Bulk Preloading |
247
|
|
|
|
|
|
|
|
248
|
|
|
|
|
|
|
=pod |
249
|
|
|
|
|
|
|
|
250
|
|
|
|
|
|
|
=head2 prefetch |
251
|
|
|
|
|
|
|
|
252
|
|
|
|
|
|
|
# Load all .tt templates into memory |
253
|
|
|
|
|
|
|
$provider->prefetch; |
254
|
|
|
|
|
|
|
|
255
|
|
|
|
|
|
|
# Load all .html and .eml templates into memory |
256
|
|
|
|
|
|
|
$provider->prefetch('*.html', '*.eml'); |
257
|
|
|
|
|
|
|
|
258
|
|
|
|
|
|
|
# Load all templates inside a SVN checkout into memory |
259
|
|
|
|
|
|
|
use File::Find::Rule; |
260
|
|
|
|
|
|
|
use File::Find::Rule::VCS; |
261
|
|
|
|
|
|
|
$provider->prefetch( |
262
|
|
|
|
|
|
|
File::Find::Rule->ignore_svn->file->readable->ascii |
263
|
|
|
|
|
|
|
); |
264
|
|
|
|
|
|
|
|
265
|
|
|
|
|
|
|
The C method is used to specify that a set of template |
266
|
|
|
|
|
|
|
files should be immediately compiled (with the compiled templates |
267
|
|
|
|
|
|
|
cached if possible) and then the compiled templates are loaded into |
268
|
|
|
|
|
|
|
memory. |
269
|
|
|
|
|
|
|
|
270
|
|
|
|
|
|
|
When used in combination with C the C method creates |
271
|
|
|
|
|
|
|
a caching strategy where the template files will never be looked at once |
272
|
|
|
|
|
|
|
the call to C has completed. Both positive (template found) and |
273
|
|
|
|
|
|
|
negative (not found or error) results will be cached. |
274
|
|
|
|
|
|
|
|
275
|
|
|
|
|
|
|
When filling the precache, the use of the internal cache will be |
276
|
|
|
|
|
|
|
temporarily disabled to avoid polluting the run-time cache state. |
277
|
|
|
|
|
|
|
|
278
|
|
|
|
|
|
|
Selection of the files to compile is done via a L search |
279
|
|
|
|
|
|
|
across all C directories. If the same file exists within more |
280
|
|
|
|
|
|
|
than one C directory, only the first one will be compiled. |
281
|
|
|
|
|
|
|
|
282
|
|
|
|
|
|
|
In the canonical usage, the C method takes a single parameter, |
283
|
|
|
|
|
|
|
which should be a L object. The method will call C |
284
|
|
|
|
|
|
|
and C on the filter you pass in, so you should consider the |
285
|
|
|
|
|
|
|
C method to be destructive to the filter. |
286
|
|
|
|
|
|
|
|
287
|
|
|
|
|
|
|
As a convenience, if the method is passed a series of strings, a new |
288
|
|
|
|
|
|
|
rule object will be created and the strings will be used to specific the |
289
|
|
|
|
|
|
|
required files to compile via a call to the C method. |
290
|
|
|
|
|
|
|
|
291
|
|
|
|
|
|
|
As a further convenience, if the method is passed no params, a default |
292
|
|
|
|
|
|
|
filter will be created for all files ending in .tt. |
293
|
|
|
|
|
|
|
|
294
|
|
|
|
|
|
|
Returns true on success, or throws an exception (dies) on error. |
295
|
|
|
|
|
|
|
|
296
|
|
|
|
|
|
|
=cut |
297
|
|
|
|
|
|
|
|
298
|
|
|
|
|
|
|
sub prefetch { |
299
|
2
|
|
|
2
|
1
|
3591
|
my $self = shift; |
300
|
2
|
|
|
|
|
20
|
my $object = $self->_OBJECT_; |
301
|
2
|
|
|
|
|
17
|
my @names = $self->_find(@_); |
302
|
2
|
|
|
|
|
8
|
my $precache = $self->{PRECACHE}; |
303
|
2
|
100
|
|
|
|
9
|
if ( $precache ) { |
304
|
|
|
|
|
|
|
# Disable the internal cache while prefetching to prevent |
305
|
|
|
|
|
|
|
# prefetched documents from polluting the cache. |
306
|
1
|
|
|
|
|
3
|
my $size = $object->{SIZE}; |
307
|
1
|
|
|
|
|
2
|
$object->{SIZE} = 0; |
308
|
|
|
|
|
|
|
|
309
|
|
|
|
|
|
|
# Fetch and add to the precache if not in it already |
310
|
1
|
|
|
|
|
2
|
foreach my $name ( @names ) { |
311
|
6
|
50
|
|
|
|
59527
|
next if $precache->{$name}; |
312
|
6
|
|
|
|
|
25
|
$precache->{$name} = [ $object->fetch($name) ]; |
313
|
|
|
|
|
|
|
} |
314
|
|
|
|
|
|
|
|
315
|
|
|
|
|
|
|
# Enable the internal cache now that we're done |
316
|
1
|
|
|
|
|
1442
|
$object->{SIZE} = $size; |
317
|
|
|
|
|
|
|
} else { |
318
|
|
|
|
|
|
|
# Just pull them to get them into the child's cache |
319
|
1
|
|
|
|
|
3
|
foreach my $name ( @names ) { |
320
|
6
|
|
|
|
|
68774
|
$object->fetch($name); |
321
|
|
|
|
|
|
|
} |
322
|
|
|
|
|
|
|
} |
323
|
2
|
|
|
|
|
1547
|
return 1; |
324
|
|
|
|
|
|
|
} |
325
|
|
|
|
|
|
|
|
326
|
|
|
|
|
|
|
sub _find { |
327
|
2
|
|
|
2
|
|
4
|
my $self = shift; |
328
|
2
|
|
|
|
|
19
|
my $filter = $self->_filter(@_)->relative->file; |
329
|
2
|
|
|
|
|
663
|
my $paths = $self->paths; |
330
|
2
|
|
|
|
|
99
|
my %seen = (); |
331
|
2
|
|
|
|
|
4
|
return grep { not $seen{$_}++ } map { $filter->in($_) } @$paths; |
|
12
|
|
|
|
|
2954
|
|
|
2
|
|
|
|
|
34
|
|
332
|
|
|
|
|
|
|
} |
333
|
|
|
|
|
|
|
|
334
|
|
|
|
|
|
|
sub _filter { |
335
|
2
|
|
|
2
|
|
5
|
my $self = shift; |
336
|
2
|
50
|
|
|
|
15
|
unless ( @_ ) { |
337
|
|
|
|
|
|
|
# Default filter |
338
|
2
|
|
|
|
|
26
|
return File::Find::Rule->name('*.tt')->file; |
339
|
|
|
|
|
|
|
} |
340
|
0
|
0
|
|
|
|
0
|
if ( Params::Util::_INSTANCE($_[0], 'File::Find::Rule') ) { |
341
|
0
|
|
|
|
|
0
|
return $_[0]; |
342
|
|
|
|
|
|
|
} |
343
|
0
|
|
|
|
|
0
|
my @names = grep { defined Params::Util::_STRING($_) } @_; |
|
0
|
|
|
|
|
0
|
|
344
|
0
|
0
|
|
|
|
0
|
if ( @names == @_ ) { |
345
|
0
|
|
|
|
|
0
|
return File::Find::Rule->name(@names)->file; |
346
|
|
|
|
|
|
|
} |
347
|
0
|
|
|
|
|
0
|
Carp::croak("Invalid filter param"); |
348
|
|
|
|
|
|
|
} |
349
|
|
|
|
|
|
|
|
350
|
|
|
|
|
|
|
|
351
|
|
|
|
|
|
|
|
352
|
|
|
|
|
|
|
|
353
|
|
|
|
|
|
|
|
354
|
|
|
|
|
|
|
##################################################################### |
355
|
|
|
|
|
|
|
# Template::Provider Methods |
356
|
|
|
|
|
|
|
|
357
|
|
|
|
|
|
|
sub fetch { |
358
|
2
|
|
|
2
|
0
|
50560
|
my $self = shift; |
359
|
2
|
|
|
|
|
7
|
my $name = shift; |
360
|
|
|
|
|
|
|
|
361
|
|
|
|
|
|
|
# If caching and we get a name in the cache, return it |
362
|
2
|
100
|
66
|
|
|
27
|
if ( $self->{PRECACHE} and not ref $name ) { |
363
|
1
|
|
|
|
|
5
|
my $cached = $self->{PRECACHE}->{$name}; |
364
|
1
|
50
|
|
|
|
7
|
return @$cached if $cached; |
365
|
|
|
|
|
|
|
} |
366
|
|
|
|
|
|
|
|
367
|
|
|
|
|
|
|
# Otherwise, hand off to the child |
368
|
1
|
|
|
|
|
7
|
return $self->_OBJECT_->fetch( $name, @_ ); |
369
|
|
|
|
|
|
|
} |
370
|
|
|
|
|
|
|
|
371
|
|
|
|
|
|
|
1; |
372
|
|
|
|
|
|
|
|
373
|
|
|
|
|
|
|
=pod |
374
|
|
|
|
|
|
|
|
375
|
|
|
|
|
|
|
=head1 CAVEATS |
376
|
|
|
|
|
|
|
|
377
|
|
|
|
|
|
|
The B precaching logic assumes a stable |
378
|
|
|
|
|
|
|
production environment in which the template files will not be changed. |
379
|
|
|
|
|
|
|
|
380
|
|
|
|
|
|
|
It is assumed that if a production release is made, then there will be |
381
|
|
|
|
|
|
|
a server or application restart that allows the caches to be refilled |
382
|
|
|
|
|
|
|
and then the children reforked. |
383
|
|
|
|
|
|
|
|
384
|
|
|
|
|
|
|
=head1 SUPPORT |
385
|
|
|
|
|
|
|
|
386
|
|
|
|
|
|
|
Bugs should be reported via the CPAN bug tracker at |
387
|
|
|
|
|
|
|
|
388
|
|
|
|
|
|
|
L |
389
|
|
|
|
|
|
|
|
390
|
|
|
|
|
|
|
For other issues, or commercial enhancement or support, contact the author. |
391
|
|
|
|
|
|
|
|
392
|
|
|
|
|
|
|
=head1 AUTHOR |
393
|
|
|
|
|
|
|
|
394
|
|
|
|
|
|
|
Adam Kennedy Eadamk@cpan.orgE |
395
|
|
|
|
|
|
|
|
396
|
|
|
|
|
|
|
=head1 SEE ALSO |
397
|
|
|
|
|
|
|
|
398
|
|
|
|
|
|
|
L |
399
|
|
|
|
|
|
|
|
400
|
|
|
|
|
|
|
=head1 COPYRIGHT |
401
|
|
|
|
|
|
|
|
402
|
|
|
|
|
|
|
Copyright 2008 Adam Kennedy. |
403
|
|
|
|
|
|
|
|
404
|
|
|
|
|
|
|
This program is free software; you can redistribute |
405
|
|
|
|
|
|
|
it and/or modify it under the same terms as Perl itself. |
406
|
|
|
|
|
|
|
|
407
|
|
|
|
|
|
|
The full text of the license can be found in the |
408
|
|
|
|
|
|
|
LICENSE file included with this module. |
409
|
|
|
|
|
|
|
|
410
|
|
|
|
|
|
|
=cut |