File Coverage

blib/lib/CGI/Application/Plugin/AnyTemplate.pm
Criterion Covered Total %
statement 171 174 98.2
branch 62 70 88.5
condition 24 32 75.0
subroutine 22 22 100.0
pod 5 6 83.3
total 284 304 93.4


line stmt bran cond sub pod time code
1              
2             package CGI::Application::Plugin::AnyTemplate;
3              
4             =head1 NAME
5              
6             CGI::Application::Plugin::AnyTemplate - Use any templating system from within CGI::Application using a unified interface
7              
8             =head1 VERSION
9              
10             Version 0.18
11              
12             =cut
13              
14             our $VERSION = '0.18';
15              
16             =head1 SYNOPSIS
17              
18             In your CGI::Application-based webapp:
19              
20             use base 'CGI::Application';
21             use CGI::Application::Plugin::AnyTemplate;
22              
23             sub cgiapp_init {
24             my $self = shift;
25              
26             # Set template options
27             $self->template->config(
28             default_type => 'TemplateToolkit',
29             );
30             }
31              
32              
33             Later on, in a runmode:
34              
35             sub my_runmode {
36             my $self = shift;
37              
38             my %template_params = (
39             name => 'Winston Churchill',
40             age => 7,
41             );
42              
43             $self->template->fill('some_template', \%template_params);
44             }
45              
46             =head1 DESCRIPTION
47              
48             =head2 Template-Independence
49              
50             C allows you to use any
51             supported Perl templating system using a single consistent interface.
52              
53             Currently supported templating systems include L,
54             L, L,
55             L and L.
56              
57             You can access any of these templating systems using the same interface.
58             In this way, you can use the same code and switch templating systems on
59             the fly.
60              
61             This approach has many uses. For instance, it can be useful in
62             migrating your application from one templating system to another.
63              
64             =head2 Embedded Components
65              
66             In addition to template abstraction, C also provides a
67             I. For instance, you might include a
68             I
component at the top of every page and a I
component
69             at the bottom of every page.
70              
71             These components are actually full L run modes, and
72             can do anything normal run mode can do, including processing form
73             parameters and filling in their own templates. See
74             below under L<"EMBEDDED COMPONENTS"> for details.
75              
76             =head2 Multiple Named Template Configurations
77              
78             You can set up multiple named template configurations and select between
79             them at run time.
80              
81             sub cgiapp_init {
82             my $self = shift;
83              
84             # Can't use Template::Toolkit any more -
85             # The boss wants everything has to be XML,
86             # so we switch to Petal
87              
88             # Set old-style template options (legacy scripts)
89             $self->template('oldstyle')->config(
90             default_type => 'TemplateToolkit',
91             TemplateToolkit => {
92             POST_CHOMP => 1,
93             }
94             );
95             # Set new-style template options as default
96             $self->template->config(
97             default_type => 'Petal',
98             auto_add_template_extension => 0,
99             );
100             }
101              
102             sub old_style_runmode {
103             my $self = shift;
104              
105             # ...
106              
107             # use TemplateToolkit to fill template edit_user.tmpl
108             $self->template('oldstyle')->fill('edit_user', \%params);
109              
110             }
111              
112             sub new_style_runmode {
113             my $self = shift;
114              
115             # ...
116              
117             # use Petal to fill template edit_user.xhml
118             $self->template->fill('edit_user.xhtml', \%params);
119              
120             }
121              
122             =head2 Flexible Syntax
123              
124             The syntax is pretty flexible. Pick a style that's most comfortable for
125             you.
126              
127             =head3 CGI::Application::Plugin::TT style syntax
128              
129             $self->template->process('edit_user', \%params);
130              
131             or (with slightly less typing):
132              
133             $self->template->fill('edit_user', \%params);
134              
135             =head3 CGI::Application load_tmpl style syntax
136              
137             my $template = $self->template->load('edit_user');
138             $template->param('foo' => 'bar');
139             $template->output;
140              
141             =head3 Verbose syntax (for complete control)
142              
143             my $template = $self->template('named_config')->load(
144             file => 'edit_user'
145             type => 'TemplateToolkit'
146             add_include_paths => '.',
147             );
148              
149             $template->param('foo' => 'bar');
150             $template->output;
151              
152             See also below under L<"CHANGING THE NAME OF THE 'template' METHOD">.
153              
154             =cut
155              
156 26     26   953785 use strict;
  26         72  
  26         997  
157 26     26   1314 use CGI::Application;
  26         8863  
  26         492  
158 26     26   153 use Carp;
  26         57  
  26         2135  
159 26     26   155 use Scalar::Util qw(weaken);
  26         45  
  26         3799  
160              
161             if ( ! eval { require Clone } ) {
162             if ( eval { require Clone::PP } ) {
163 26     26   132 no strict 'refs';
  26         53  
  26         2262  
164             *Clone::clone = *Clone::PP::clone;
165             }
166             else {
167             die "Neiter Clone nor Clone::PP found - $@\n";
168             }
169             }
170              
171 26     26   173 use vars qw(@ISA @EXPORT @EXPORT_OK %EXPORT_TAGS $CAPAT_Namespace);
  26         47  
  26         69853  
172              
173             @ISA = ('Exporter');
174              
175             @ISA = 'Exporter';
176             @EXPORT = qw(template);
177             @EXPORT_OK = qw(load_tmpl);
178             %EXPORT_TAGS = (load_tmpl => ['load_tmpl', @EXPORT]);
179              
180             $CAPAT_Namespace = '__ANY_TEMPLATE';
181              
182             if (CGI::Application->can('new_hook')) {
183             CGI::Application->new_hook('template_pre_process');
184             CGI::Application->new_hook('template_post_process');
185             CGI::Application->new_hook('load_tmpl');
186             }
187              
188             sub _new {
189 82     82   154 my $proto = shift;
190 82   33     478 my $class = ref $proto || $proto;
191 82         162 my $webapp = shift;
192 82         136 my $conf_name = shift;
193              
194 82         459 my $self = {
195             'conf_name' => $conf_name,
196             'base_config' => {},
197             'current_config' => {},
198             'webapp' => $webapp,
199             };
200              
201 82         253 bless $self, $class;
202              
203 82         502 weaken $self->{'webapp'};
204              
205 82         353 return $self;
206             }
207              
208 2     2   7 sub _default_type { 'HTMLTemplate' }
209 2     2   9 sub _default_extension { '.html' }
210              
211             =head1 METHODS
212              
213             =head2 config
214              
215             Initialize the C system and provide the default
216             configuration.
217              
218             $self->template->config(
219             default_type => 'HTMLTemplate',
220             );
221              
222             You can keep multiple configurations handy at the same time by passing a
223             value to C