1 #============================================================= -*-Perl-*-
6 # Module defining a context in which a template document is processed.
7 # This is the runtime processing interface through which templates
8 # can access the functionality of the Template Toolkit.
11 # Andy Wardley <abw@wardley.org>
14 # Copyright (C) 1996-2007 Andy Wardley. All Rights Reserved.
16 # This module is free software; you can redistribute it and/or
17 # modify it under the same terms as Perl itself.
19 #============================================================================
21 package Template::Context;
25 use base 'Template::Base';
29 use Template::Constants;
30 use Template::Exception;
31 use Scalar::Util 'blessed';
33 use constant DOCUMENT => 'Template::Document';
34 use constant EXCEPTION => 'Template::Exception';
35 use constant BADGER_EXCEPTION => 'Badger::Exception';
38 our $DEBUG = 0 unless defined $DEBUG;
39 our $DEBUG_FORMAT = "\n## \$file line \$line : [% \$text %] ##\n";
40 our $VIEW_CLASS = 'Template::View';
43 #========================================================================
44 # ----- PUBLIC METHODS -----
45 #========================================================================
47 #------------------------------------------------------------------------
50 # General purpose method to fetch a template and return it in compiled
51 # form. In the usual case, the $name parameter will be a simple string
52 # containing the name of a template (e.g. 'header'). It may also be
53 # a reference to Template::Document object (or sub-class) or a Perl
54 # sub-routine. These are considered to be compiled templates and are
55 # returned intact. Finally, it may be a reference to any other kind
56 # of valid input source accepted by Template::Provider (e.g. scalar
57 # ref, glob, IO handle, etc).
59 # Templates may be cached at one of 3 different levels. The internal
60 # BLOCKS member is a local cache which holds references to all
61 # template blocks used or imported via PROCESS since the context's
62 # reset() method was last called. This is checked first and if the
63 # template is not found, the method then walks down the BLOCKSTACK
64 # list. This contains references to the block definition tables in
65 # any enclosing Template::Documents that we're visiting (e.g. we've
66 # been called via an INCLUDE and we want to access a BLOCK defined in
67 # the template that INCLUDE'd us). If nothing is defined, then we
68 # iterate through the LOAD_TEMPLATES providers list as a 'chain of
69 # responsibility' (see Design Patterns) asking each object to fetch()
70 # the template if it can.
72 # Returns the compiled template. On error, undef is returned and
73 # the internal ERROR value (read via error()) is set to contain an
74 # error message of the form "$name: $error".
75 #------------------------------------------------------------------------
78 my ($self, $name) = @_;
79 my ($prefix, $blocks, $defblocks, $provider, $template, $error);
80 my ($shortname, $blockname, $providers);
82 $self->debug("template($name)") if $self->{ DEBUG };
84 # references to Template::Document (or sub-class) objects objects, or
85 # CODE references are assumed to be pre-compiled templates and are
88 if (blessed($name) && $name->isa(DOCUMENT))
89 || ref($name) eq 'CODE';
95 $self->debug("looking for block [$name]") if $self->{ DEBUG };
97 # we first look in the BLOCKS hash for a BLOCK that may have
98 # been imported from a template (via PROCESS)
100 if ($template = $self->{ BLOCKS }->{ $name });
102 # then we iterate through the BLKSTACK list to see if any of the
103 # Template::Documents we're visiting define this BLOCK
104 foreach $blocks (@{ $self->{ BLKSTACK } }) {
106 if $blocks && ($template = $blocks->{ $name });
109 # now it's time to ask the providers, so we look to see if any
110 # prefix is specified to indicate the desired provider set.
111 if ($^O eq 'MSWin32') {
113 $prefix = $1 if $shortname =~ s/^(\w{2,})://o;
116 $prefix = $1 if $shortname =~ s/^(\w+)://;
119 if (defined $prefix) {
120 $providers = $self->{ PREFIX_MAP }->{ $prefix }
121 || return $self->throw( Template::Constants::ERROR_FILE,
122 "no providers for template prefix '$prefix'");
125 $providers = $self->{ PREFIX_MAP }->{ default }
126 || $self->{ LOAD_TEMPLATES }
130 # Finally we try the regular template providers which will
131 # handle references to files, text, etc., as well as templates
132 # reference by name. If
136 $self->debug("asking providers for [$shortname] [$blockname]")
139 foreach my $provider (@$providers) {
140 ($template, $error) = $provider->fetch($shortname, $prefix);
142 if ($error == Template::Constants::STATUS_ERROR) {
143 # $template contains exception object
144 if (blessed($template) && $template->isa(EXCEPTION)
145 && $template->type eq Template::Constants::ERROR_FILE) {
146 $self->throw($template);
149 $self->throw( Template::Constants::ERROR_FILE, $template );
152 # DECLINE is ok, carry on
154 elsif (length $blockname) {
156 if $template = $template->blocks->{ $blockname };
163 last if ref $shortname || ! $self->{ EXPOSE_BLOCKS };
164 $shortname =~ s{/([^/]+)$}{} || last;
165 $blockname = length $blockname ? "$1/$blockname" : $1;
168 $self->throw(Template::Constants::ERROR_FILE, "$name: not found");
172 #------------------------------------------------------------------------
173 # plugin($name, \@args)
175 # Calls on each of the LOAD_PLUGINS providers in turn to fetch() (i.e. load
176 # and instantiate) a plugin of the specified name. Additional parameters
177 # passed are propagated to the new() constructor for the plugin.
178 # Returns a reference to a new plugin object or other reference. On
179 # error, undef is returned and the appropriate error message is set for
180 # subsequent retrieval via error().
181 #------------------------------------------------------------------------
184 my ($self, $name, $args) = @_;
185 my ($provider, $plugin, $error);
187 $self->debug("plugin($name, ", defined $args ? @$args : '[ ]', ')')
190 # request the named plugin from each of the LOAD_PLUGINS providers in turn
191 foreach my $provider (@{ $self->{ LOAD_PLUGINS } }) {
192 ($plugin, $error) = $provider->fetch($name, $args, $self);
193 return $plugin unless $error;
194 if ($error == Template::Constants::STATUS_ERROR) {
195 $self->throw($plugin) if ref $plugin;
196 $self->throw(Template::Constants::ERROR_PLUGIN, $plugin);
200 $self->throw(Template::Constants::ERROR_PLUGIN, "$name: plugin not found");
204 #------------------------------------------------------------------------
205 # filter($name, \@args, $alias)
207 # Similar to plugin() above, but querying the LOAD_FILTERS providers to
208 # return filter instances. An alias may be provided which is used to
209 # save the returned filter in a local cache.
210 #------------------------------------------------------------------------
213 my ($self, $name, $args, $alias) = @_;
214 my ($provider, $filter, $error);
216 $self->debug("filter($name, ",
217 defined $args ? @$args : '[ ]',
218 defined $alias ? $alias : '<no alias>', ')')
221 # use any cached version of the filter if no params provided
223 if ! $args && ! ref $name
224 && ($filter = $self->{ FILTER_CACHE }->{ $name });
226 # request the named filter from each of the FILTERS providers in turn
227 foreach my $provider (@{ $self->{ LOAD_FILTERS } }) {
228 ($filter, $error) = $provider->fetch($name, $args, $self);
230 if ($error == Template::Constants::STATUS_ERROR) {
231 $self->throw($filter) if ref $filter;
232 $self->throw(Template::Constants::ERROR_FILTER, $filter);
234 # return $self->error($filter)
235 # if $error == &Template::Constants::STATUS_ERROR;
238 return $self->error("$name: filter not found")
241 # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
242 # commented out by abw on 19 Nov 2001 to fix problem with xmlstyle
243 # plugin which may re-define a filter by calling define_filter()
244 # multiple times. With the automatic aliasing/caching below, any
245 # new filter definition isn't seen. Don't think this will cause
246 # any problems as filters explicitly supplied with aliases will
247 # still work as expected.
248 # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
249 # alias defaults to name if undefined
251 # unless defined($alias) or ref($name) or $args;
253 # cache FILTER if alias is valid
254 $self->{ FILTER_CACHE }->{ $alias } = $filter
261 #------------------------------------------------------------------------
264 # Create a new Template::View bound to this context.
265 #------------------------------------------------------------------------
269 require Template::View;
270 return $VIEW_CLASS->new($self, @_)
271 || $self->throw(&Template::Constants::ERROR_VIEW,
276 #------------------------------------------------------------------------
277 # process($template, \%params) [% PROCESS template var=val ... %]
278 # process($template, \%params, $local) [% INCLUDE template var=val ... %]
280 # Processes the template named or referenced by the first parameter.
281 # The optional second parameter may reference a hash array of variable
282 # definitions. These are set before the template is processed by
283 # calling update() on the stash. Note that, unless the third parameter
284 # is true, the context is not localised and these, and any other
285 # variables set in the template will retain their new values after this
286 # method returns. The third parameter is in place so that this method
287 # can handle INCLUDE calls: the stash will be localized.
289 # Returns the output of processing the template. Errors are thrown
290 # as Template::Exception objects via die().
291 #------------------------------------------------------------------------
294 my ($self, $template, $params, $localize) = @_;
295 my ($trim, $blocks) = @$self{ qw( TRIM BLOCKS ) };
296 my (@compiled, $name, $compiled);
297 my ($stash, $component, $tblocks, $error, $tmpout);
300 $template = [ $template ] unless ref $template eq 'ARRAY';
302 $self->debug("process([ ", join(', '), @$template, ' ], ',
303 defined $params ? $params : '<no params>', ', ',
304 $localize ? '<localized>' : '<unlocalized>', ')')
307 # fetch compiled template for each name specified
308 foreach $name (@$template) {
309 push(@compiled, $self->template($name));
313 # localise the variable stash with any parameters passed
314 $stash = $self->{ STASH } = $self->{ STASH }->clone($params);
316 # update stash with any new parameters passed
317 $self->{ STASH }->update($params);
318 $stash = $self->{ STASH };
322 # save current component
323 eval { $component = $stash->get('component') };
325 foreach $name (@$template) {
326 $compiled = shift @compiled;
327 my $element = ref $compiled eq 'CODE'
328 ? { (name => (ref $name ? '' : $name), modtime => time()) }
331 if (blessed($component) && $component->isa(DOCUMENT)) {
332 $element->{ caller } = $component->{ name };
333 $element->{ callers } = $component->{ callers } || [];
334 push(@{$element->{ callers }}, $element->{ caller });
337 $stash->set('component', $element);
340 # merge any local blocks defined in the Template::Document
341 # into our local BLOCKS cache
342 @$blocks{ keys %$tblocks } = values %$tblocks
343 if (blessed($compiled) && $compiled->isa(DOCUMENT))
344 && ($tblocks = $compiled->blocks);
347 if (ref $compiled eq 'CODE') {
348 $tmpout = &$compiled($self);
350 elsif (ref $compiled) {
351 $tmpout = $compiled->process($self);
355 "invalid template reference: $compiled");
366 # pop last item from callers.
367 # NOTE - this will not be called if template throws an
368 # error. The whole issue of caller and callers should be
369 # revisited to try and avoid putting this info directly into
370 # the component data structure. Perhaps use a local element
373 pop(@{$element->{ callers }})
374 if (blessed($component) && $component->isa(DOCUMENT));
376 $stash->set('component', $component);
381 # ensure stash is delocalised before dying
382 $self->{ STASH } = $self->{ STASH }->declone();
385 $self->throw(ref $error
386 ? $error : (Template::Constants::ERROR_FILE, $error))
393 #------------------------------------------------------------------------
394 # include($template, \%params) [% INCLUDE template var = val, ... %]
396 # Similar to process() above but processing the template in a local
397 # context. Any variables passed by reference to a hash as the second
398 # parameter will be set before the template is processed and then
399 # revert to their original values before the method returns. Similarly,
400 # any changes made to non-global variables within the template will
401 # persist only until the template is processed.
403 # Returns the output of processing the template. Errors are thrown
404 # as Template::Exception objects via die().
405 #------------------------------------------------------------------------
408 my ($self, $template, $params) = @_;
409 return $self->process($template, $params, 'localize me!');
412 #------------------------------------------------------------------------
415 # Insert the contents of a file without parsing.
416 #------------------------------------------------------------------------
419 my ($self, $file) = @_;
420 my ($prefix, $providers, $text, $error);
423 my $files = ref $file eq 'ARRAY' ? $file : [ $file ];
425 $self->debug("insert([ ", join(', '), @$files, " ])")
429 FILE: foreach $file (@$files) {
432 if ($^O eq 'MSWin32') {
434 $prefix = $1 if $name =~ s/^(\w{2,})://o;
437 $prefix = $1 if $name =~ s/^(\w+)://;
440 if (defined $prefix) {
441 $providers = $self->{ PREFIX_MAP }->{ $prefix }
442 || return $self->throw(Template::Constants::ERROR_FILE,
443 "no providers for file prefix '$prefix'");
446 $providers = $self->{ PREFIX_MAP }->{ default }
447 || $self->{ LOAD_TEMPLATES };
450 foreach my $provider (@$providers) {
451 ($text, $error) = $provider->load($name, $prefix);
452 next FILE unless $error;
453 if ($error == Template::Constants::STATUS_ERROR) {
454 $self->throw($text) if ref $text;
455 $self->throw(Template::Constants::ERROR_FILE, $text);
458 $self->throw(Template::Constants::ERROR_FILE, "$file: not found");
467 #------------------------------------------------------------------------
468 # throw($type, $info, \$output) [% THROW errtype "Error info" %]
470 # Throws a Template::Exception object by calling die(). This method
471 # may be passed a reference to an existing Template::Exception object;
472 # a single value containing an error message which is used to
473 # instantiate a Template::Exception of type 'undef'; or a pair of
474 # values representing the exception type and info from which a
475 # Template::Exception object is instantiated. e.g.
477 # $context->throw($exception);
478 # $context->throw("I'm sorry Dave, I can't do that");
479 # $context->throw('denied', "I'm sorry Dave, I can't do that");
481 # An optional third parameter can be supplied in the last case which
482 # is a reference to the current output buffer containing the results
483 # of processing the template up to the point at which the exception
484 # was thrown. The RETURN and STOP directives, for example, use this
485 # to propagate output back to the user, but it can safely be ignored
488 # This method rides on a one-way ticket to die() oblivion. It does not
489 # return in any real sense of the word, but should get caught by a
490 # surrounding eval { } block (e.g. a BLOCK or TRY) and handled
491 # accordingly, or returned to the caller as an uncaught exception.
492 #------------------------------------------------------------------------
495 my ($self, $error, $info, $output) = @_;
499 if (blessed($error) && $error->isa(EXCEPTION)) {
502 elsif (blessed($error) && $error->isa(BADGER_EXCEPTION)) {
503 # convert a Badger::Exception to a Template::Exception so that
504 # things continue to work during the transition to Badger
505 die EXCEPTION->new($error->type, $error->info);
507 elsif (defined $info) {
508 die (EXCEPTION->new($error, $info, $output));
512 die (EXCEPTION->new('undef', $error, $output));
519 #------------------------------------------------------------------------
520 # catch($error, \$output)
522 # Called by various directives after catching an error thrown via die()
523 # from within an eval { } block. The first parameter contains the errror
524 # which may be a sanitized reference to a Template::Exception object
525 # (such as that raised by the throw() method above, a plugin object,
526 # and so on) or an error message thrown via die from somewhere in user
527 # code. The latter are coerced into 'undef' Template::Exception objects.
528 # Like throw() above, a reference to a scalar may be passed as an
529 # additional parameter to represent the current output buffer
530 # localised within the eval block. As exceptions are thrown upwards
531 # and outwards from nested blocks, the catch() method reconstructs the
532 # correct output buffer from these fragments, storing it in the
533 # exception object for passing further onwards and upwards.
535 # Returns a reference to a Template::Exception object..
536 #------------------------------------------------------------------------
539 my ($self, $error, $output) = @_;
542 && ( $error->isa(EXCEPTION) || $error->isa(BADGER_EXCEPTION) ) ) {
543 $error->text($output) if $output;
547 return EXCEPTION->new('undef', $error, $output);
552 #------------------------------------------------------------------------
556 # The localise() method creates a local copy of the current stash,
557 # allowing the existing state of variables to be saved and later
558 # restored via delocalise().
560 # A reference to a hash array may be passed containing local variable
561 # definitions which should be added to the cloned namespace. These
562 # values persist until delocalisation.
563 #------------------------------------------------------------------------
567 $self->{ STASH } = $self->{ STASH }->clone(@_);
572 $self->{ STASH } = $self->{ STASH }->declone();
576 #------------------------------------------------------------------------
577 # visit($document, $blocks)
579 # Each Template::Document calls the visit() method on the context
580 # before processing itself. It passes a reference to the hash array
581 # of named BLOCKs defined within the document, allowing them to be
582 # added to the internal BLKSTACK list which is subsequently used by
583 # template() to resolve templates.
585 #------------------------------------------------------------------------
588 my ($self, $document, $blocks) = @_;
589 unshift(@{ $self->{ BLKSTACK } }, $blocks)
593 #------------------------------------------------------------------------
596 # The leave() method is called when the document has finished
597 # processing itself. This removes the entry from the BLKSTACK list
598 # that was added visit() above. For persistence of BLOCK definitions,
599 # the process() method (i.e. the PROCESS directive) does some extra
600 # magic to copy BLOCKs into a shared hash.
601 #------------------------------------------------------------------------
605 shift(@{ $self->{ BLKSTACK } });
609 #------------------------------------------------------------------------
610 # define_block($name, $block)
612 # Adds a new BLOCK definition to the local BLOCKS cache. $block may
613 # be specified as a reference to a sub-routine or Template::Document
614 # object or as text which is compiled into a template. Returns a true
615 # value (the $block reference or compiled block reference) if
616 # successful or undef on failure. Call error() to retrieve the
617 # relevent error message (i.e. compilation failure).
618 #------------------------------------------------------------------------
621 my ($self, $name, $block) = @_;
622 $block = $self->template(\$block)
625 $self->{ BLOCKS }->{ $name } = $block;
629 #------------------------------------------------------------------------
630 # define_filter($name, $filter, $is_dynamic)
632 # Adds a new FILTER definition to the local FILTER_CACHE.
633 #------------------------------------------------------------------------
636 my ($self, $name, $filter, $is_dynamic) = @_;
637 my ($result, $error);
638 $filter = [ $filter, 1 ] if $is_dynamic;
640 foreach my $provider (@{ $self->{ LOAD_FILTERS } }) {
641 ($result, $error) = $provider->store($name, $filter);
642 return 1 unless $error;
643 $self->throw(&Template::Constants::ERROR_FILTER, $result)
644 if $error == &Template::Constants::STATUS_ERROR;
646 $self->throw(&Template::Constants::ERROR_FILTER,
647 "FILTER providers declined to store filter $name");
651 my ($self, $name, $params) = @_;
654 if (defined $params->{ base }) {
655 my $base = $self->{ STASH }->get($params->{ base });
658 &Template::Constants::ERROR_VIEW,
659 "view base is not defined: $params->{ base }"
663 &Template::Constants::ERROR_VIEW,
664 "view base is not a $VIEW_CLASS object: $params->{ base } => $base"
665 ) unless blessed($base) && $base->isa($VIEW_CLASS);
667 $params->{ base } = $base;
669 my $view = $self->view($params);
671 $self->{ STASH }->set($name, $view);
675 my ($self, $views) = @_;
677 # a list reference is better because the order is deterministic (and so
678 # allows an earlier VIEW to be the base for a later VIEW), but we'll
679 # accept a hash reference and assume that the user knows the order of
680 # processing is undefined
682 if ref $views eq 'HASH';
684 # make of copy so we don't destroy the original list reference
689 $self->define_view(splice(@items, 0, 2));
694 #------------------------------------------------------------------------
697 # Reset the state of the internal BLOCKS hash to clear any BLOCK
698 # definitions imported via the PROCESS directive. Any original
699 # BLOCKS definitions passed to the constructor will be restored.
700 #------------------------------------------------------------------------
703 my ($self, $blocks) = @_;
704 $self->{ BLKSTACK } = [ ];
705 $self->{ BLOCKS } = { %{ $self->{ INIT_BLOCKS } } };
709 #------------------------------------------------------------------------
712 # Simple accessor methods to return the STASH values. This is likely
713 # to be called quite often so we provide a direct method rather than
714 # relying on the slower AUTOLOAD.
715 #------------------------------------------------------------------------
718 return $_[0]->{ STASH };
722 #------------------------------------------------------------------------
723 # define_vmethod($type, $name, \&sub)
725 # Passes $type, $name, and &sub on to stash->define_vmethod().
726 #------------------------------------------------------------------------
729 $self->stash->define_vmethod(@_);
733 #------------------------------------------------------------------------
734 # debugging($command, @args, \%params)
736 # Method for controlling the debugging status of the context. The first
737 # argument can be 'on' or 'off' to enable/disable debugging, 'format'
738 # to define the format of the debug message, or 'msg' to generate a
739 # debugging message reporting the file, line, message text, etc.,
740 # according to the current debug format.
741 #------------------------------------------------------------------------
745 my $hash = ref $_[-1] eq 'HASH' ? pop : { };
748 # print "*** debug(@args)\n";
750 if ($args[0] =~ /^on|1$/i) {
751 $self->{ DEBUG_DIRS } = 1;
754 elsif ($args[0] =~ /^off|0$/i) {
755 $self->{ DEBUG_DIRS } = 0;
761 if ($args[0] =~ /^msg$/i) {
762 return unless $self->{ DEBUG_DIRS };
763 my $format = $self->{ DEBUG_FORMAT };
764 $format = $DEBUG_FORMAT unless defined $format;
765 $format =~ s/\$(\w+)/$hash->{ $1 }/ge;
768 elsif ($args[0] =~ /^format$/i) {
769 $self->{ DEBUG_FORMAT } = $args[1];
778 #------------------------------------------------------------------------
781 # Provides pseudo-methods for read-only access to various internal
782 # members. For example, templates(), plugins(), filters(),
783 # eval_perl(), load_perl(), etc. These aren't called very often, or
784 # may never be called at all.
785 #------------------------------------------------------------------------
789 my $method = $AUTOLOAD;
793 return if $method eq 'DESTROY';
795 warn "no such context method/member: $method\n"
796 unless defined ($result = $self->{ uc $method });
802 #------------------------------------------------------------------------
805 # Stash may contain references back to the Context via macro closures,
806 # etc. This breaks the circular references.
807 #------------------------------------------------------------------------
811 undef $self->{ STASH };
816 #========================================================================
817 # -- PRIVATE METHODS --
818 #========================================================================
820 #------------------------------------------------------------------------
823 # Initialisation method called by Template::Base::new()
824 #------------------------------------------------------------------------
827 my ($self, $config) = @_;
828 my ($name, $item, $method, $block, $blocks);
830 LOAD_TEMPLATES => 'provider',
831 LOAD_PLUGINS => 'plugins',
832 LOAD_FILTERS => 'filters'
835 # LOAD_TEMPLATE, LOAD_PLUGINS, LOAD_FILTERS - lists of providers
836 while (($name, $method) = splice(@itemlut, 0, 2)) {
837 $item = $config->{ $name }
838 || Template::Config->$method($config)
839 || return $self->error($Template::Config::ERROR);
840 $self->{ $name } = ref $item eq 'ARRAY' ? $item : [ $item ];
843 my $providers = $self->{ LOAD_TEMPLATES };
844 my $prefix_map = $self->{ PREFIX_MAP } = $config->{ PREFIX_MAP } || { };
845 while (my ($key, $val) = each %$prefix_map) {
846 $prefix_map->{ $key } = [ ref $val ? $val :
847 map { $providers->[$_] } split(/\D+/, $val) ]
848 unless ref $val eq 'ARRAY';
852 $self->{ STASH } = $config->{ STASH } || do {
853 my $predefs = $config->{ VARIABLES }
854 || $config->{ PRE_DEFINE }
857 # hack to get stash to know about debug mode
858 $predefs->{ _DEBUG } = ( ($config->{ DEBUG } || 0)
859 & &Template::Constants::DEBUG_UNDEF ) ? 1 : 0
860 unless defined $predefs->{ _DEBUG };
861 $predefs->{ _STRICT } = $config->{ STRICT };
863 Template::Config->stash($predefs)
864 || return $self->error($Template::Config::ERROR);
867 # compile any template BLOCKS specified as text
868 $blocks = $config->{ BLOCKS } || { };
869 $self->{ INIT_BLOCKS } = $self->{ BLOCKS } = {
871 $block = $blocks->{ $_ };
872 $block = $self->template(\$block)
881 $self->define_views( $config->{ VIEWS } )
882 if $config->{ VIEWS };
884 # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
885 # RECURSION - flag indicating is recursion into templates is supported
886 # EVAL_PERL - flag indicating if PERL blocks should be processed
887 # TRIM - flag to remove leading and trailing whitespace from output
888 # BLKSTACK - list of hashes of BLOCKs defined in current template(s)
889 # CONFIG - original configuration hash
890 # EXPOSE_BLOCKS - make blocks visible as pseudo-files
891 # DEBUG_FORMAT - format for generating template runtime debugging messages
892 # DEBUG - format for generating template runtime debugging messages
894 $self->{ RECURSION } = $config->{ RECURSION } || 0;
895 $self->{ EVAL_PERL } = $config->{ EVAL_PERL } || 0;
896 $self->{ TRIM } = $config->{ TRIM } || 0;
897 $self->{ BLKSTACK } = [ ];
898 $self->{ CONFIG } = $config;
899 $self->{ EXPOSE_BLOCKS } = defined $config->{ EXPOSE_BLOCKS }
900 ? $config->{ EXPOSE_BLOCKS }
903 $self->{ DEBUG_FORMAT } = $config->{ DEBUG_FORMAT };
904 $self->{ DEBUG_DIRS } = ($config->{ DEBUG } || 0)
905 & Template::Constants::DEBUG_DIRS;
906 $self->{ DEBUG } = defined $config->{ DEBUG }
907 ? $config->{ DEBUG } & ( Template::Constants::DEBUG_CONTEXT
908 | Template::Constants::DEBUG_FLAGS )
915 #------------------------------------------------------------------------
918 # Debug method which returns a string representing the internal state
919 # of the context object.
920 #------------------------------------------------------------------------
924 my $output = "[Template::Context] {\n";
925 my $format = " %-16s => %s\n";
928 foreach $key (qw( RECURSION EVAL_PERL TRIM )) {
929 $output .= sprintf($format, $key, $self->{ $key });
931 foreach my $pname (qw( LOAD_TEMPLATES LOAD_PLUGINS LOAD_FILTERS )) {
932 my $provtext = "[\n";
933 foreach my $prov (@{ $self->{ $pname } }) {
934 $provtext .= $prov->_dump();
935 # $provtext .= ",\n";
937 $provtext =~ s/\n/\n /g;
938 $provtext =~ s/\s+$//;
939 $provtext .= ",\n ]";
940 $output .= sprintf($format, $pname, $provtext);
942 $output .= sprintf($format, STASH => $self->{ STASH }->_dump());
954 Template::Context - Runtime context in which templates are processed
958 use Template::Context;
961 $context = Template::Context->new(\%config)
962 || die $Template::Context::ERROR;
964 # fetch (load and compile) a template
965 $template = $context->template($template_name);
967 # fetch (load and instantiate) a plugin object
968 $plugin = $context->plugin($name, \@args);
970 # fetch (return or create) a filter subroutine
971 $filter = $context->filter($name, \@args, $alias);
973 # process/include a template, errors are thrown via die()
974 $output = $context->process($template, \%vars);
975 $output = $context->include($template, \%vars);
977 # raise an exception via die()
978 $context->throw($error_type, $error_message, \$output_buffer);
980 # catch an exception, clean it up and fix output buffer
981 $exception = $context->catch($exception, \$output_buffer);
983 # save/restore the stash to effect variable localisation
984 $new_stash = $context->localise(\%vars);
985 $old_stash = $context->delocalise();
987 # add new BLOCK or FILTER definitions
988 $context->define_block($name, $block);
989 $context->define_filter($name, \&filtersub, $is_dynamic);
991 # reset context, clearing any imported BLOCK definitions
994 # methods for accessing internal items
995 $stash = $context->stash();
996 $tflag = $context->trim();
997 $epflag = $context->eval_perl();
998 $providers = $context->templates();
999 $providers = $context->plugins();
1000 $providers = $context->filters();
1005 The C<Template::Context> module defines an object class for representing
1006 a runtime context in which templates are processed. It provides an
1007 interface to the fundamental operations of the Template Toolkit
1008 processing engine through which compiled templates (i.e. Perl code
1009 constructed from the template source) can process templates, load
1010 plugins and filters, raise exceptions and so on.
1012 A default C<Template::Context> object is created by the L<Template> module.
1013 Any C<Template::Context> options may be passed to the L<Template>
1014 L<new()|Template#new()> constructor method and will be forwarded to the
1015 C<Template::Context> constructor.
1019 my $template = Template->new({
1023 header => 'This is the header',
1024 footer => 'This is the footer',
1028 Similarly, the C<Template::Context> constructor will forward all configuration
1029 parameters onto other default objects (e.g. L<Template::Provider>,
1030 L<Template::Plugins>, L<Template::Filters>, etc.) that it may need to
1033 $context = Template::Context->new({
1034 INCLUDE_PATH => '/home/abw/templates', # provider option
1035 TAG_STYLE => 'html', # parser option
1038 A C<Template::Context> object (or subclass) can be explicitly instantiated and
1039 passed to the L<Template> L<new()|Template#new()> constructor method as the
1040 C<CONTEXT> configuration item.
1043 use Template::Context;
1045 my $context = Template::Context->new({ TRIM => 1 });
1046 my $template = Template->new({ CONTEXT => $context });
1048 The L<Template> module uses the L<Template::Config>
1049 L<context()|Template::Config#context()> factory method to create a default
1050 context object when required. The C<$Template::Config::CONTEXT> package
1051 variable may be set to specify an alternate context module. This will be
1052 loaded automatically and its L<new()> constructor method called by the
1053 L<context()|Template::Config#context()> factory method when a default context
1058 $Template::Config::CONTEXT = 'MyOrg::Template::Context';
1060 my $template = Template->new({
1062 EXTRA_MAGIC => 'red hot', # your extra config items
1068 =head2 new(\%params)
1070 The C<new()> constructor method is called to instantiate a
1071 C<Template::Context> object. Configuration parameters may be specified as a
1072 HASH reference or as a list of C<name =E<gt> value> pairs.
1074 my $context = Template::Context->new({
1075 INCLUDE_PATH => 'header',
1076 POST_PROCESS => 'footer',
1079 my $context = Template::Context->new( EVAL_PERL => 1 );
1081 The C<new()> method returns a C<Template::Context> object or C<undef> on
1082 error. In the latter case, a relevant error message can be retrieved by the
1083 L<error()|Template::Base#error()> class method or directly from the
1084 C<$Template::Context::ERROR> package variable.
1086 my $context = Template::Context->new(\%config)
1087 || die Template::Context->error();
1089 my $context = Template::Context->new(\%config)
1090 || die $Template::Context::ERROR;
1092 The following configuration items may be specified. Please see
1093 L<Template::Manual::Config> for further details.
1097 The L<VARIABLES|Template::Manual::Config#VARIABLES> option can be used to
1098 specify a hash array of template variables.
1100 my $context = Template::Context->new({
1102 title => 'A Demo Page',
1103 author => 'Joe Random Hacker',
1110 The L<BLOCKS|Template::Manual::Config#BLOCKS> option can be used to pre-define
1111 a default set of template blocks.
1113 my $context = Template::Context->new({
1115 header => 'The Header. [% title %]',
1116 footer => sub { return $some_output_text },
1117 another => Template::Document->new({ ... }),
1123 The L<VIEWS|Template::Manual::Config#VIEWS> option can be used to pre-define
1124 one or more L<Template::View> objects.
1126 my $context = Template::Context->new({
1128 bottom => { prefix => 'bottom/' },
1129 middle => { prefix => 'middle/', base => 'bottom' },
1130 top => { prefix => 'top/', base => 'middle' },
1136 The L<TRIM|Template::Manual::Config#TRIM> option can be set to have any
1137 leading and trailing whitespace automatically removed from the output of all
1138 template files and C<BLOCK>s.
1160 The L<EVAL_PERL|Template::Manual::Config#EVAL_PERL> is used to indicate if
1161 C<PERL> and/or C<RAWPERL> blocks should be evaluated. It is disabled by
1166 The L<RECURSION|Template::Manual::Config#RECURSION> can be set to
1167 allow templates to recursively process themselves, either directly
1168 (e.g. template C<foo> calls C<INCLUDE foo>) or indirectly (e.g.
1169 C<foo> calls C<INCLUDE bar> which calls C<INCLUDE foo>).
1171 =head3 LOAD_TEMPLATES
1173 The L<LOAD_TEMPLATES|Template::Manual::Config#LOAD_TEMPLATES> option can be
1174 used to provide a reference to a list of L<Template::Provider> objects or
1175 sub-classes thereof which will take responsibility for loading and compiling
1178 my $context = Template::Context->new({
1180 MyOrg::Template::Provider->new({ ... }),
1181 Template::Provider->new({ ... }),
1187 The L<LOAD_PLUGINS|Template::Manual::Config#LOAD_PLUGINS> options can be used
1188 to specify a list of provider objects responsible for loading and
1189 instantiating template plugin objects.
1191 my $context = Template::Context->new({
1193 MyOrg::Template::Plugins->new({ ... }),
1194 Template::Plugins->new({ ... }),
1200 The L<LOAD_FILTERS|Template::Manual::Config#LOAD_FILTERS> option can be used
1201 to specify a list of provider objects for returning and/or creating filter
1204 my $context = Template::Context->new({
1206 MyTemplate::Filters->new(),
1207 Template::Filters->new(),
1213 The L<STASH|Template::Manual::Config#STASH> option can be used to
1214 specify a L<Template::Stash> object or sub-class which will take
1215 responsibility for managing template variables.
1217 my $stash = MyOrg::Template::Stash->new({ ... });
1218 my $context = Template::Context->new({
1224 The L<DEBUG|Template::Manual::Config#DEBUG> option can be used to enable
1225 various debugging features of the L<Template::Context> module.
1227 use Template::Constants qw( :debug );
1229 my $template = Template->new({
1230 DEBUG => DEBUG_CONTEXT | DEBUG_DIRS,
1233 =head2 template($name)
1235 Returns a compiled template by querying each of the L<LOAD_TEMPLATES> providers
1236 (instances of L<Template::Provider>, or sub-class) in turn.
1238 $template = $context->template('header');
1240 On error, a L<Template::Exception> object of type 'C<file>' is thrown via
1241 C<die()>. This can be caught by enclosing the call to C<template()> in an
1242 C<eval> block and examining C<$@>.
1244 eval { $template = $context->template('header') };
1246 print "failed to fetch template: $@\n";
1249 =head2 plugin($name, \@args)
1251 Instantiates a plugin object by querying each of the L<LOAD_PLUGINS>
1252 providers. The default L<LOAD_PLUGINS> provider is a L<Template::Plugins>
1253 object which attempts to load plugin modules, according the various
1254 configuration items such as L<PLUGIN_BASE|Template::Plugins#PLUGIN_BASE>,
1255 L<LOAD_PERL|Template::Plugins#LOAD_PERL>, etc., and then instantiate an object
1256 via L<new()|Template::Plugin#new()>. A reference to a list of constructor
1257 arguments may be passed as the second parameter. These are forwarded to the
1260 Returns a reference to a plugin (which is generally an object, but
1261 doesn't have to be). Errors are thrown as L<Template::Exception> objects
1262 with the type set to 'C<plugin>'.
1264 $plugin = $context->plugin('DBI', 'dbi:msql:mydbname');
1266 =head2 filter($name, \@args, $alias)
1268 Instantiates a filter subroutine by querying the L<LOAD_FILTERS> providers.
1269 The default L<LOAD_FILTERS> provider is a L<Template::Filters> object.
1271 Additional arguments may be passed by list reference along with an optional
1272 alias under which the filter will be cached for subsequent use. The filter is
1273 cached under its own C<$name> if C<$alias> is undefined. Subsequent calls to
1274 C<filter($name)> will return the cached entry, if defined. Specifying arguments
1275 bypasses the caching mechanism and always creates a new filter. Errors are
1276 thrown as L<Template::Exception> objects with the type set to 'C<filter>'.
1278 # static filter (no args)
1279 $filter = $context->filter('html');
1281 # dynamic filter (args) aliased to 'padright'
1282 $filter = $context->filter('format', '%60s', 'padright');
1284 # retrieve previous filter via 'padright' alias
1285 $filter = $context->filter('padright');
1287 =head2 process($template, \%vars)
1289 Processes a template named or referenced by the first parameter and returns
1290 the output generated. An optional reference to a hash array may be passed
1291 as the second parameter, containing variable definitions which will be set
1292 before the template is processed. The template is processed in the current
1293 context, with no localisation of variables performed. Errors are thrown
1294 as L<Template::Exception> objects via C<die()>.
1296 $output = $context->process('header', { title => 'Hello World' });
1298 =head2 include($template, \%vars)
1300 Similar to L<process()>, but using localised variables. Changes made to
1301 any variables will only persist until the C<include()> method completes.
1303 $output = $context->include('header', { title => 'Hello World' });
1305 =head2 throw($error_type, $error_message, \$output)
1307 Raises an exception in the form of a L<Template::Exception> object by calling
1308 C<die()>. This method may be passed a reference to an existing
1309 L<Template::Exception> object; a single value containing an error message
1310 which is used to instantiate a L<Template::Exception> of type 'C<undef>'; or a
1311 pair of values representing the exception C<type> and C<info> from which a
1312 L<Template::Exception> object is instantiated. e.g.
1314 $context->throw($exception);
1315 $context->throw("I'm sorry Dave, I can't do that");
1316 $context->throw('denied', "I'm sorry Dave, I can't do that");
1318 The optional third parameter may be a reference to the current output
1319 buffer. This is then stored in the exception object when created,
1320 allowing the catcher to examine and use the output up to the point at
1321 which the exception was raised.
1323 $output .= 'blah blah blah';
1324 $output .= 'more rhubarb';
1325 $context->throw('yack', 'Too much yacking', \$output);
1327 =head2 catch($exception, \$output)
1329 Catches an exception thrown, either as a reference to a L<Template::Exception>
1330 object or some other value. In the latter case, the error string is promoted
1331 to a L<Template::Exception> object of 'C<undef>' type. This method also
1332 accepts a reference to the current output buffer which is passed to the
1333 L<Template::Exception> constructor, or is appended to the output buffer stored
1334 in an existing L<Template::Exception> object, if unique (i.e. not the same
1335 reference). By this process, the correct state of the output buffer can be
1336 reconstructed for simple or nested throws.
1338 =head2 define_block($name, $block)
1340 Adds a new block definition to the internal L<BLOCKS> cache. The first
1341 argument should contain the name of the block and the second a reference
1342 to a L<Template::Document> object or template sub-routine, or template text
1343 which is automatically compiled into a template sub-routine.
1345 Returns a true value (the sub-routine or L<Template::Document> reference) on
1346 success or undef on failure. The relevant error message can be retrieved by
1347 calling the L<error()|Template::Base#error()> method.
1349 =head2 define_filter($name, \&filter, $is_dynamic)
1351 Adds a new filter definition by calling the
1352 L<store()|Template::Filters#store()> method on each of the L<LOAD_FILTERS>
1353 providers until accepted (in the usual case, this is accepted straight away by
1354 the one and only L<Template::Filters> provider). The first argument should
1355 contain the name of the filter and the second a reference to a filter
1356 subroutine. The optional third argument can be set to any true value to
1357 indicate that the subroutine is a dynamic filter factory.
1359 Returns a true value or throws a 'C<filter>' exception on error.
1361 =head2 define_view($name, \%params)
1363 This method allows you to define a named L<view|Template::View>.
1365 $context->define_view(
1367 prefix => 'my_templates/'
1371 The view is then accessible as a template variable.
1373 [% my_view.print(some_data) %]
1375 =head2 define_views($views)
1377 This method allows you to define multiple named L<views|Template::View>.
1378 A reference to a hash array or list reference should be passed as an argument.
1380 $context->define_view({ # hash reference
1382 prefix => 'my_templates_one/'
1385 prefix => 'my_templates_two/'
1389 If you're defining multiple views of which one or more are based on other
1390 views in the same definition then you should pass them as a list reference.
1391 This ensures that they get created in the right order (Perl does not preserve
1392 the order of items defined in a hash reference so you can't guarantee that
1393 your base class view will be defined before your subclass view).
1395 $context->define_view([ # list referenence
1397 prefix => 'my_templates_one/'
1400 prefix => 'my_templates_two/' ,
1401 base => 'my_view_one',
1405 The views are then accessible as template variables.
1407 [% my_view_one.print(some_data) %]
1408 [% my_view_two.print(some_data) %]
1410 See also the L<VIEWS> option.
1412 =head2 localise(\%vars)
1414 Clones the stash to create a context with localised variables. Returns a
1415 reference to the newly cloned stash object which is also stored
1418 $stash = $context->localise();
1422 Restore the stash to its state prior to localisation.
1424 $stash = $context->delocalise();
1426 =head2 visit(\%blocks)
1428 This method is called by L<Template::Document> objects immediately before
1429 they process their content. It is called to register any local C<BLOCK>
1430 definitions with the context object so that they may be subsequently
1431 delivered on request.
1435 Compliment to the L<visit()> method. Called by L<Template::Document> objects
1436 immediately after they process their content.
1440 Clears the local L<BLOCKS> cache of any C<BLOCK> definitions. Any initial set of
1441 L<BLOCKS> specified as a configuration item to the constructor will be reinstated.
1445 An C<AUTOLOAD> method provides access to context configuration items.
1447 $stash = $context->stash();
1448 $tflag = $context->trim();
1449 $epflag = $context->eval_perl();
1454 Andy Wardley E<lt>abw@wardley.orgE<gt> L<http://wardley.org/>
1458 Copyright (C) 1996-2007 Andy Wardley. All Rights Reserved.
1460 This module is free software; you can redistribute it and/or
1461 modify it under the same terms as Perl itself.
1465 L<Template>, L<Template::Document>, L<Template::Exception>,
1466 L<Template::Filters>, L<Template::Plugins>, L<Template::Provider>,
1467 L<Template::Service>, L<Template::Stash>
1473 # perl-indent-level: 4
1474 # indent-tabs-mode: nil
1477 # vim: expandtab shiftwidth=4: