Add built local::lib
[catagits/Gitalist.git] / local-lib5 / man / man3 / Template::Manual::Variables.3pm
diff --git a/local-lib5/man/man3/Template::Manual::Variables.3pm b/local-lib5/man/man3/Template::Manual::Variables.3pm
new file mode 100644 (file)
index 0000000..f51ce2f
--- /dev/null
@@ -0,0 +1,1135 @@
+.\" Automatically generated by Pod::Man v1.37, Pod::Parser v1.3
+.\"
+.\" Standard preamble:
+.\" ========================================================================
+.de Sh \" Subsection heading
+.br
+.if t .Sp
+.ne 5
+.PP
+\fB\\$1\fR
+.PP
+..
+.de Sp \" Vertical space (when we can't use .PP)
+.if t .sp .5v
+.if n .sp
+..
+.de Vb \" Begin verbatim text
+.ft CW
+.nf
+.ne \\$1
+..
+.de Ve \" End verbatim text
+.ft R
+.fi
+..
+.\" Set up some character translations and predefined strings.  \*(-- will
+.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
+.\" double quote, and \*(R" will give a right double quote.  | will give a
+.\" real vertical bar.  \*(C+ will give a nicer C++.  Capital omega is used to
+.\" do unbreakable dashes and therefore won't be available.  \*(C` and \*(C'
+.\" expand to `' in nroff, nothing in troff, for use with C<>.
+.tr \(*W-|\(bv\*(Tr
+.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
+.ie n \{\
+.    ds -- \(*W-
+.    ds PI pi
+.    if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
+.    if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\"  diablo 12 pitch
+.    ds L" ""
+.    ds R" ""
+.    ds C` ""
+.    ds C' ""
+'br\}
+.el\{\
+.    ds -- \|\(em\|
+.    ds PI \(*p
+.    ds L" ``
+.    ds R" ''
+'br\}
+.\"
+.\" If the F register is turned on, we'll generate index entries on stderr for
+.\" titles (.TH), headers (.SH), subsections (.Sh), items (.Ip), and index
+.\" entries marked with X<> in POD.  Of course, you'll have to process the
+.\" output yourself in some meaningful fashion.
+.if \nF \{\
+.    de IX
+.    tm Index:\\$1\t\\n%\t"\\$2"
+..
+.    nr % 0
+.    rr F
+.\}
+.\"
+.\" For nroff, turn off justification.  Always turn off hyphenation; it makes
+.\" way too many mistakes in technical documents.
+.hy 0
+.if n .na
+.\"
+.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
+.\" Fear.  Run.  Save yourself.  No user-serviceable parts.
+.    \" fudge factors for nroff and troff
+.if n \{\
+.    ds #H 0
+.    ds #V .8m
+.    ds #F .3m
+.    ds #[ \f1
+.    ds #] \fP
+.\}
+.if t \{\
+.    ds #H ((1u-(\\\\n(.fu%2u))*.13m)
+.    ds #V .6m
+.    ds #F 0
+.    ds #[ \&
+.    ds #] \&
+.\}
+.    \" simple accents for nroff and troff
+.if n \{\
+.    ds ' \&
+.    ds ` \&
+.    ds ^ \&
+.    ds , \&
+.    ds ~ ~
+.    ds /
+.\}
+.if t \{\
+.    ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
+.    ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
+.    ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
+.    ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
+.    ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
+.    ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
+.\}
+.    \" troff and (daisy-wheel) nroff accents
+.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
+.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
+.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
+.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
+.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
+.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
+.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
+.ds ae a\h'-(\w'a'u*4/10)'e
+.ds Ae A\h'-(\w'A'u*4/10)'E
+.    \" corrections for vroff
+.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
+.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
+.    \" for low resolution devices (crt and lpr)
+.if \n(.H>23 .if \n(.V>19 \
+\{\
+.    ds : e
+.    ds 8 ss
+.    ds o a
+.    ds d- d\h'-1'\(ga
+.    ds D- D\h'-1'\(hy
+.    ds th \o'bp'
+.    ds Th \o'LP'
+.    ds ae ae
+.    ds Ae AE
+.\}
+.rm #[ #] #H #V #F C
+.\" ========================================================================
+.\"
+.IX Title "Template::Manual::Variables 3"
+.TH Template::Manual::Variables 3 "2008-11-13" "perl v5.8.7" "User Contributed Perl Documentation"
+.SH "NAME"
+Template::Manual::Variables \- Template variables and code bindings
+.SH "Template Variables"
+.IX Header "Template Variables"
+A reference to a hash array may be passed as the second argument to the
+\&\fIprocess()\fR method, containing definitions of template
+variables. The \f(CW\*(C`VARIABLES\*(C'\fR (a.k.a. \f(CW\*(C`PRE_DEFINE\*(C'\fR) option can also be used to
+pre-define variables for all templates processed by the object.
+.PP
+.Vb 6
+\&    my $tt = Template\->new({
+\&        VARIABLES => {
+\&            version => 3.14,
+\&            release => 'Sahara',
+\&        },  
+\&    });
+.Ve
+.PP
+.Vb 3
+\&    my $vars = {
+\&        serial_no => 271828,
+\&    };
+.Ve
+.PP
+.Vb 1
+\&    $tt\->process('myfile', $vars);
+.Ve
+.PP
+\&\fImyfile\fR template:
+.PP
+.Vb 2
+\&    This is version [% version %] ([% release %]).
+\&    Serial number: [% serial_no %]
+.Ve
+.PP
+Generated Output: 
+.PP
+.Vb 2
+\&    This is version 3.14 (Sahara)
+\&    Serial number: 271828
+.Ve
+.PP
+Variable names may contain any alphanumeric characters or underscores. They
+may be lower, upper or mixed case although the usual convention is to use
+lower case. The case \fIis\fR significant however, and '\f(CW\*(C`foo\*(C'\fR', '\f(CW\*(C`Foo\*(C'\fR' and
+\&'\f(CW\*(C`FOO\*(C'\fR' are all different variables. Upper case variable names are permitted,
+but not recommended due to a possible conflict with an existing or future
+reserved word.  As of version 2.00, these are:
+.PP
+.Vb 5
+\&    GET CALL SET DEFAULT INSERT INCLUDE PROCESS WRAPPER 
+\&    IF UNLESS ELSE ELSIF FOR FOREACH WHILE SWITCH CASE
+\&    USE PLUGIN FILTER MACRO PERL RAWPERL BLOCK META
+\&    TRY THROW CATCH FINAL NEXT LAST BREAK RETURN STOP 
+\&    CLEAR TO STEP AND OR NOT MOD DIV END
+.Ve
+.PP
+The variable values may be of virtually any Perl type, including
+simple scalars, references to lists, hash arrays, subroutines or
+objects.  The Template Toolkit will automatically apply the correct
+procedure to accessing these values as they are used in the template.
+.PP
+Example data:
+.PP
+.Vb 11
+\&    my $vars = {
+\&        article => 'The Third Shoe',
+\&        person  => { 
+\&            id    => 314, 
+\&            name  => 'Mr. Blue',
+\&            email => 'blue@nowhere.org',
+\&        },
+\&        primes  => [ 2, 3, 5, 7, 11, 13 ],
+\&        wizard  => sub { return join(' ', 'Abracadabra!', @_) },
+\&        cgi     => CGI\->new('mode=submit&debug=1'),
+\&    };
+.Ve
+.PP
+Example template:
+.PP
+.Vb 1
+\&    [% article %]
+.Ve
+.PP
+.Vb 1
+\&    [% person.id %]: [% person.name %] <[% person.email %]>
+.Ve
+.PP
+.Vb 2
+\&    [% primes.first %] \- [% primes.last %], including [% primes.3 %]
+\&    [% primes.size %] prime numbers: [% primes.join(', ') %]
+.Ve
+.PP
+.Vb 2
+\&    [% wizard %]
+\&    [% wizard('Hocus Pocus!') %]
+.Ve
+.PP
+.Vb 1
+\&    [% cgi.param('mode') %]
+.Ve
+.PP
+Generated output:
+.PP
+.Vb 1
+\&    The Third Shoe
+.Ve
+.PP
+.Vb 1
+\&    314: Mr. Blue <blue@nowhere.org>
+.Ve
+.PP
+.Vb 2
+\&    2 \- 13, including 7
+\&    6 prime numbers: 2, 3, 5, 7, 11, 13
+.Ve
+.PP
+.Vb 2
+\&    Abracadabra!
+\&    Abracadabra! Hocus Pocus!
+.Ve
+.PP
+.Vb 1
+\&    submit
+.Ve
+.Sh "Scalar Values"
+.IX Subsection "Scalar Values"
+Regular scalar variables are accessed by simply specifying their name.
+As these are just entries in the top-level variable hash they can be 
+considered special cases of hash array referencing as described below,
+with the main namespace hash automatically implied.
+.PP
+.Vb 1
+\&    [% article %]
+.Ve
+.Sh "Hash Array References"
+.IX Subsection "Hash Array References"
+Members of hash arrays are accessed by specifying the hash reference
+and key separated by the dot '\f(CW\*(C`.\*(C'\fR' operator.
+.PP
+Example data:
+.PP
+.Vb 8
+\&    my $vars = {
+\&        'home' => 'http://www.myserver.com/homepage.html',
+\&        'page' => {
+\&            'this' => 'mypage.html',
+\&            'next' => 'nextpage.html',
+\&            'prev' => 'prevpage.html',
+\&        },
+\&    };
+.Ve
+.PP
+Example template:
+.PP
+.Vb 3
+\&    <a href="[% home %]">Home</a>
+\&    <a href="[% page.prev %]">Previous Page</a>
+\&    <a href="[% page.next %]">Next Page</a>
+.Ve
+.PP
+Generated output:
+.PP
+.Vb 3
+\&    <a href="http://www.myserver.com/homepage.html">Home</a>
+\&    <a href="prevpage.html">Previous Page</a>
+\&    <a href="nextpage.html">Next Page</a>
+.Ve
+.PP
+Any key in a hash which starts with a '\f(CW\*(C`_\*(C'\fR' or '\f(CW\*(C`.\*(C'\fR' character will be
+considered private and cannot be evaluated or updated from within a
+template.  The undefined value will be returned for any such variable
+accessed which the Template Toolkit will silently ignore (unless the
+\&\f(CW\*(C`DEBUG\*(C'\fR option is enabled).
+.PP
+Example data:
+.PP
+.Vb 9
+\&    my $vars = {
+\&        message => 'Hello World!',
+\&        _secret => "On the Internet, no\-one knows you're a dog",
+\&        thing   => {
+\&            public    => 123,
+\&            _private  => 456,
+\&            '.hidden' => 789,
+\&        },
+\&    };
+.Ve
+.PP
+Example template:
+.PP
+.Vb 5
+\&    [% message %]           # outputs "Hello World!"
+\&    [% _secret %]           # no output
+\&    [% thing.public %]      # outputs "123"
+\&    [% thing._private %]    # no output
+\&    [% thing..hidden %]     # ERROR: unexpected token (..)
+.Ve
+.PP
+You can disable this feature by setting the \f(CW$Template::Stash::PRIVATE\fR
+package variable to a false value.
+.PP
+.Vb 1
+\&    $Template::Stash::PRIVATE = undef;   # now you can thing._private
+.Ve
+.PP
+To access a hash entry using a key stored in another variable, prefix
+the key variable with '\f(CW\*(C`$\*(C'\fR' to have it interpolated before use (see
+\&\*(L"Variable Interpolation\*(R").
+.PP
+.Vb 2
+\&    [% pagename = 'next' %]
+\&    [% page.$pagename %]       # same as [% page.next %]
+.Ve
+.PP
+When you assign to a variable that contains multiple namespace 
+elements (i.e. it has one or more '\f(CW\*(C`.\*(C'\fR' characters in the name),
+any hashes required to represent intermediate namespaces will be 
+created automatically.  In this following example, the \f(CW\*(C`product\*(C'\fR 
+variable automatically springs into life as a hash array unless
+otherwise defined.
+.PP
+.Vb 4
+\&    [% product.id    = 'XYZ\-2000' 
+\&       product.desc  = 'Bogon Generator'
+\&       product.price = 666 
+\&    %]
+.Ve
+.PP
+.Vb 2
+\&    The [% product.id %] [% product.desc %] 
+\&    costs $[% product.price %].00
+.Ve
+.PP
+Generated output:
+.PP
+.Vb 2
+\&    The XYZ\-2000 Bogon Generator 
+\&    costs $666.00
+.Ve
+.PP
+You can use Perl's familiar \f(CW\*(C`{\*(C'\fR ... \f(CW\*(C`}\*(C'\fR construct to explicitly create
+a hash and assign it to a variable.  Note that commas are optional
+between key/value pairs and \f(CW\*(C`=\*(C'\fR can be used in place of \f(CW\*(C`=>\*(C'\fR.
+.PP
+.Vb 7
+\&    # minimal TT style
+\&    [% product = {
+\&         id    = 'XYZ\-2000'
+\&         desc  = 'Bogon Generator'
+\&         price = 666
+\&       }
+\&    %]
+.Ve
+.PP
+.Vb 7
+\&    # perl style
+\&    [% product = {
+\&         id    => 'XYZ\-2000',
+\&         desc  => 'Bogon Generator',
+\&         price => 666,
+\&       }
+\&    %]
+.Ve
+.Sh "List References"
+.IX Subsection "List References"
+Items in lists are also accessed by use of the dot operator.
+.PP
+Example data:
+.PP
+.Vb 3
+\&    my $vars = {
+\&        people => [ 'Tom', 'Dick', 'Larry' ],
+\&    };
+.Ve
+.PP
+Example template:
+.PP
+.Vb 3
+\&    [% people.0 %]          # Tom
+\&    [% people.1 %]          # Dick
+\&    [% people.2 %]          # Larry
+.Ve
+.PP
+The \f(CW\*(C`FOREACH\*(C'\fR directive can be used to iterate through items in a list.
+.PP
+.Vb 3
+\&    [% FOREACH person IN people %]
+\&    Hello [% person %]
+\&    [% END %]
+.Ve
+.PP
+Generated output:
+.PP
+.Vb 3
+\&    Hello Tom
+\&    Hello Dick
+\&    Hello Larry
+.Ve
+.PP
+Lists can be constructed in-situ using the regular anonymous list
+\&\f(CW\*(C`[\*(C'\fR ... \f(CW\*(C`]\*(C'\fR construct.  Commas between items are optional.
+.PP
+.Vb 1
+\&    [% cols = [ 'red', 'green', 'blue' ] %]
+.Ve
+.PP
+.Vb 3
+\&    [% FOREACH c IN cols %]
+\&       [% c %]
+\&    [% END %]
+.Ve
+.PP
+or:
+.PP
+.Vb 3
+\&    [% FOREACH c IN [ 'red', 'green', 'blue' ] %]
+\&       [% c %]
+\&    [% END %]
+.Ve
+.PP
+You can also create simple numerical sequences using the \f(CW\*(C`..\*(C'\fR range
+operator:
+.PP
+.Vb 1
+\&    [% n = [ 1 .. 4 ] %]    # n is [ 1, 2, 3, 4 ]
+.Ve
+.PP
+.Vb 4
+\&    [% x = 4
+\&       y = 8
+\&       z = [x..y]           # z is [ 4, 5, 6, 7, 8 ]
+\&    %]
+.Ve
+.Sh "Subroutines"
+.IX Subsection "Subroutines"
+Template variables can contain references to Perl subroutines.  When
+the variable is used, the Template Toolkit will automatically call the
+subroutine, passing any additional arguments specified.  The return
+value from the subroutine is used as the variable value and inserted
+into the document output.
+.PP
+.Vb 3
+\&    my $vars = {
+\&        wizard  => sub { return join(' ', 'Abracadabra!', @_) },
+\&    };
+.Ve
+.PP
+Example template:
+.PP
+.Vb 2
+\&    [% wizard %]                    # Abracadabra!
+\&    [% wizard('Hocus Pocus!') %]    # Abracadabra! Hocus Pocus!
+.Ve
+.Sh "Objects"
+.IX Subsection "Objects"
+Template variables can also contain references to Perl objects.
+Methods are called using the dot operator to specify the method
+against the object variable.  Additional arguments can be specified
+as with subroutines.
+.PP
+.Vb 1
+\&    use CGI;
+.Ve
+.PP
+.Vb 4
+\&    my $vars = {
+\&        # hard coded CGI params for purpose of example
+\&        cgi  => CGI\->new('mode=submit&debug=1'),
+\&    };
+.Ve
+.PP
+Example template:
+.PP
+.Vb 3
+\&    [% FOREACH p IN cgi.param %]     # returns list of param keys
+\&    [% p %] => [% cgi.param(p) %]   # fetch each param value
+\&    [% END %]
+.Ve
+.PP
+Generated output:
+.PP
+.Vb 2
+\&    mode => submit
+\&    debug => 1
+.Ve
+.PP
+Object methods can also be called as lvalues.  That is, they can appear on 
+the left side of an assignment.  The method will be called passing the 
+assigning value as an argument.  
+.PP
+.Vb 1
+\&    [% myobj.method = 10 %]
+.Ve
+.PP
+equivalent to:
+.PP
+.Vb 1
+\&    [% myobj.method(10) %]
+.Ve
+.Sh "Passing Parameters and Returning Values"
+.IX Subsection "Passing Parameters and Returning Values"
+Subroutines and methods will be passed any arguments specified in the
+template.  Any template variables in the argument list will first be
+evaluated and their resultant values passed to the code.
+.PP
+.Vb 3
+\&    my $vars = {
+\&        mycode => sub { return 'received ' . join(', ', @_) },
+\&    };
+.Ve
+.PP
+template:
+.PP
+.Vb 2
+\&    [% foo = 10 %]
+\&    [% mycode(foo, 20) %]       # received 10, 20
+.Ve
+.PP
+Named parameters may also be specified.  These are automatically collected
+into a single hash array which is passed by reference as the \fBlast\fR 
+parameter to the sub\-routine.  Named parameters can be specified using
+either \f(CW\*(C`=>\*(C'\fR or \f(CW\*(C`=\*(C'\fR and can appear anywhere in the argument list.
+.PP
+.Vb 3
+\&    my $vars = {
+\&        myjoin => \e&myjoin,
+\&    };
+.Ve
+.PP
+.Vb 5
+\&    sub myjoin {
+\&        # look for hash ref as last argument
+\&        my $params = ref $_[\-1] eq 'HASH' ? pop : { };
+\&        return join($params\->{ joint } || ' + ', @_);
+\&    }
+.Ve
+.PP
+Example template:
+.PP
+.Vb 3
+\&    [% myjoin(10, 20, 30) %]
+\&    [% myjoin(10, 20, 30, joint = ' \- ' %]
+\&    [% myjoin(joint => ' * ', 10, 20, 30 %]
+.Ve
+.PP
+Generated output:
+.PP
+.Vb 3
+\&    10 + 20 + 30
+\&    10 \- 20 \- 30
+\&    10 * 20 * 30
+.Ve
+.PP
+Parenthesised parameters may be added to any element of a variable,
+not just those that are bound to code or object methods.  At present,
+parameters will be ignored if the variable isn't \*(L"callable\*(R" but are 
+supported for future extensions.  Think of them as \*(L"hints\*(R" to that 
+variable, rather than just arguments passed to a function.
+.PP
+.Vb 2
+\&    [% r = 'Romeo' %]
+\&    [% r(100, 99, s, t, v) %]       # outputs "Romeo"
+.Ve
+.PP
+User code should return a value for the variable it represents. This
+can be any of the Perl data types described above: a scalar, or
+reference to a list, hash, subroutine or object.  Where code returns a
+list of multiple values the items will automatically be folded into a
+list reference which can be accessed as per normal.
+.PP
+.Vb 5
+\&    my $vars = {
+\&        # either is OK, first is recommended
+\&        items1 => sub { return [ 'foo', 'bar', 'baz' ] },
+\&        items2 => sub { return ( 'foo', 'bar', 'baz' ) },
+\&    };
+.Ve
+.PP
+Example template:
+.PP
+.Vb 3
+\&    [% FOREACH i IN items1 %]
+\&       ...
+\&    [% END %]
+.Ve
+.PP
+.Vb 3
+\&    [% FOREACH i IN items2 %]
+\&       ...
+\&    [% END %]
+.Ve
+.Sh "Error Handling"
+.IX Subsection "Error Handling"
+Errors can be reported from user code by calling \f(CW\*(C`die()\*(C'\fR.  Errors raised
+in this way are caught by the Template Toolkit and converted to
+structured exceptions which can be handled from within the template.
+A reference to the exception object is then available as the \f(CW\*(C`error\*(C'\fR
+variable.
+.PP
+.Vb 5
+\&    my $vars = {
+\&        barf => sub { 
+\&            die "a sick error has occurred\en";
+\&        },
+\&    };
+.Ve
+.PP
+Example template:
+.PP
+.Vb 5
+\&    [% TRY %]
+\&       [% barf %]       # calls sub which throws error via die()
+\&    [% CATCH %]
+\&       [% error.info %]     # outputs "a sick error has occurred\en"
+\&    [% END %]
+.Ve
+.PP
+Error messages thrown via \f(CW\*(C`die()\*(C'\fR are converted to exceptions of type
+\&\f(CW\*(C`undef\*(C'\fR (the literal string \*(L"undef\*(R" rather than the undefined value).
+Exceptions of user-defined types can be thrown by calling \f(CW\*(C`die()\*(C'\fR with 
+a reference to a Template::Exception object.
+.PP
+.Vb 1
+\&    use Template::Exception;
+.Ve
+.PP
+.Vb 6
+\&    my $vars = {
+\&        login => sub { 
+\&            ...do something...
+\&            die Template::Exception\->new( badpwd => 'password too silly' );
+\&        },
+\&    };
+.Ve
+.PP
+Example template:
+.PP
+.Vb 7
+\&    [% TRY %]
+\&       [% login %]
+\&    [% CATCH badpwd %]
+\&       Bad password: [% error.info %]
+\&    [% CATCH %]
+\&       Some other '[% error.type %]' error: [% error.info %]
+\&    [% END %]
+.Ve
+.PP
+The exception types \f(CW\*(C`stop\*(C'\fR and \f(CW\*(C`return\*(C'\fR are used to implement the 
+\&\f(CW\*(C`STOP\*(C'\fR and \f(CW\*(C`RETURN\*(C'\fR directives.  Throwing an exception as:
+.PP
+.Vb 1
+\&    die (Template::Exception\->new('stop'));
+.Ve
+.PP
+has the same effect as the directive:
+.PP
+.Vb 1
+\&    [% STOP %]
+.Ve
+.SH "Virtual Methods"
+.IX Header "Virtual Methods"
+The Template Toolkit implements a number of \*(L"virtual methods\*(R" which 
+can be applied to scalars, hashes or lists.  For example:
+.PP
+.Vb 2
+\&    [% mylist = [ 'foo', 'bar', 'baz' ] %]
+\&    [% newlist = mylist.sort %]
+.Ve
+.PP
+Here \f(CW\*(C`mylist\*(C'\fR is a regular reference to a list, and 'sort' is 
+a virtual method that returns a new list of the items in sorted 
+order.  You can chain multiple virtual methods together.  For
+example:
+.PP
+.Vb 1
+\&    [% mylist.sort.join(', ') %]
+.Ve
+.PP
+Here the \f(CW\*(C`join\*(C'\fR virtual method is called to join the sorted list into
+a single string, generating the following output:
+.PP
+.Vb 1
+\&    bar, baz, foo
+.Ve
+.PP
+See Template::Manual::VMethods for details of all the virtual 
+methods available.
+.SH "Variable Interpolation"
+.IX Header "Variable Interpolation"
+The Template Toolkit uses \f(CW\*(C`$\*(C'\fR consistently to indicate that a variable
+should be interpolated in position.  Most frequently, you see this in 
+double-quoted strings:
+.PP
+.Vb 1
+\&    [% fullname = "$honorific $firstname $surname" %]
+.Ve
+.PP
+Or embedded in plain text when the \f(CW\*(C`INTERPOLATE\*(C'\fR option is set:
+.PP
+.Vb 1
+\&    Dear $honorific $firstname $surname,
+.Ve
+.PP
+The same rules apply within directives.  If a variable is prefixed
+with a \f(CW\*(C`$\*(C'\fR then it is replaced with its value before being used.  The
+most common use is to retrieve an element from a hash where the key is
+stored in a variable.
+.PP
+.Vb 2
+\&    [% uid = 'abw' %]
+\&    [% users.$uid %]         # same as 'userlist.abw'
+.Ve
+.PP
+Curly braces can be used to delimit interpolated variable names where
+necessary.
+.PP
+.Vb 1
+\&    [% users.${me.id}.name %]
+.Ve
+.PP
+Directives such as \f(CW\*(C`INCLUDE\*(C'\fR, \f(CW\*(C`PROCESS\*(C'\fR, etc., that accept a template name
+as the first argument, will automatically quote it for convenience.
+.PP
+.Vb 1
+\&    [% INCLUDE foo/bar.txt %]
+.Ve
+.PP
+The above example is equivalent to:
+.PP
+.Vb 1
+\&    [% INCLUDE "foo/bar.txt" %]
+.Ve
+.PP
+To \f(CW\*(C`INCLUDE\*(C'\fR a template whose name is stored in a variable, simply
+prefix the variable name with \f(CW\*(C`$\*(C'\fR to have it interpolated.
+.PP
+.Vb 2
+\&    [% myfile = 'header' %]
+\&    [% INCLUDE $myfile %]
+.Ve
+.PP
+This is equivalent to:
+.PP
+.Vb 1
+\&    [% INCLUDE header %]
+.Ve
+.PP
+Note also that a variable containing a reference to a Template::Document
+object can also be processed in this way.
+.PP
+.Vb 3
+\&    my $vars = {
+\&        header => Template::Document\->new({ ... }),
+\&    };
+.Ve
+.PP
+Example template:
+.PP
+.Vb 1
+\&    [% INCLUDE $header %]
+.Ve
+.SH "Local and Global Variables"
+.IX Header "Local and Global Variables"
+Any simple variables that you create, or any changes you make to
+existing variables, will only persist while the template is being
+processed.  The top-level variable hash is copied before processing
+begins and any changes to variables are made in this copy, leaving the
+original intact.  
+.PP
+The same thing happens when you \f(CW\*(C`INCLUDE\*(C'\fR another template. The current
+namespace hash is cloned to prevent any variable changes made in the included
+template from interfering with existing variables. The \f(CW\*(C`PROCESS\*(C'\fR option bypasses
+the localisation step altogether making it slightly faster, but requiring
+greater attention to the possibility of side effects caused by creating or
+changing any variables within the processed template.
+.PP
+.Vb 3
+\&    [% BLOCK change_name %]
+\&       [% name = 'bar' %]
+\&    [% END %]
+.Ve
+.PP
+.Vb 5
+\&    [% name = 'foo' %] 
+\&    [% INCLUDE change_name %]
+\&    [% name %]              # foo
+\&    [% PROCESS change_name %]
+\&    [% name %]              # bar
+.Ve
+.PP
+Dotted compound variables behave slightly differently because the
+localisation process is only skin deep.  The current variable
+namespace hash is copied, but no attempt is made to perform a
+deep-copy of other structures within it (hashes, arrays, objects,
+etc).  A variable referencing a hash, for example, will be copied to
+create a new reference but which points to the same hash.  Thus, the
+general rule is that simple variables (undotted variables) are
+localised, but existing complex structures (dotted variables) are not.
+.PP
+.Vb 4
+\&    [% BLOCK all_change %]
+\&       [% x = 20 %]         # changes copy
+\&       [% y.z = 'zulu' %]       # changes original
+\&    [% END %]
+.Ve
+.PP
+.Vb 6
+\&    [% x = 10
+\&       y = { z => 'zebra' }
+\&    %]
+\&    [% INCLUDE all_change %]
+\&    [% x %]             # still '10'
+\&    [% y.z %]               # now 'zulu'
+.Ve
+.PP
+If you create a complex structure such as a hash or list reference
+within a local template context then it will cease to exist when 
+the template is finished processing.  
+.PP
+.Vb 5
+\&    [% BLOCK new_stuff %]
+\&       [% # define a new 'y' hash array in local context
+\&          y = { z => 'zulu' }
+\&       %]
+\&    [% END %]
+.Ve
+.PP
+.Vb 4
+\&    [% x = 10 %]
+\&    [% INCLUDE new_stuff %]
+\&    [% x %]             # outputs '10'
+\&    [% y %]             # nothing, y is undefined
+.Ve
+.PP
+Similarly, if you update an element of a compound variable which
+\&\fIdoesn't\fR already exists then a hash will be created automatically
+and deleted again at the end of the block.
+.PP
+.Vb 3
+\&    [% BLOCK new_stuff %]
+\&       [% y.z = 'zulu' %]
+\&    [% END %]
+.Ve
+.PP
+However, if the hash \fIdoes\fR already exist then you will modify the
+original with permanent effect.  To avoid potential confusion, it is
+recommended that you don't update elements of complex variables from
+within blocks or templates included by another.
+.PP
+If you want to create or update truly global variables then you can 
+use the 'global' namespace.  This is a hash array automatically created
+in the top-level namespace which all templates, localised or otherwise
+see the same reference to.  Changes made to variables within this
+hash are visible across all templates.
+.PP
+.Vb 1
+\&    [% global.version = 123 %]
+.Ve
+.SH "Compile Time Constant Folding"
+.IX Header "Compile Time Constant Folding"
+In addition to variables that get resolved each time a template is
+processed, you can also define variables that get resolved just once
+when the template is compiled.  This generally results in templates
+processing faster because there is less work to be done.
+.PP
+To define compile-time constants, specify a \f(CW\*(C`CONSTANTS\*(C'\fR hash as a
+constructor item as per \f(CW\*(C`VARIABLES\*(C'\fR.  The \f(CW\*(C`CONSTANTS\*(C'\fR hash can contain any
+kind of complex, nested, or dynamic data structures, just like regular
+variables.
+.PP
+.Vb 13
+\&    my $tt = Template\->new({
+\&        CONSTANTS => {
+\&            version => 3.14,
+\&            release => 'skyrocket',
+\&            col     => {
+\&                back => '#ffffff',
+\&                fore => '#000000',
+\&            },
+\&            myobj => My::Object\->new(),
+\&            mysub => sub { ... },
+\&            joint => ', ',
+\&        },
+\&    });
+.Ve
+.PP
+Within a template, you access these variables using the \f(CW\*(C`constants\*(C'\fR
+namespace prefix.
+.PP
+.Vb 2
+\&    Version [% constants.version %] ([% constants.release %])
+\&    Background: [% constants.col.back %]
+.Ve
+.PP
+When the template is compiled, these variable references are replaced
+with the corresponding value.  No further variable lookup is then 
+required when the template is processed.
+.PP
+You can call subroutines, object methods, and even virtual methods on
+constant variables.
+.PP
+.Vb 3
+\&    [% constants.mysub(10, 20) %]
+\&    [% constants.myobj(30, 40) %]
+\&    [% constants.col.keys.sort.join(', ') %]
+.Ve
+.PP
+One important proviso is that any arguments you pass to subroutines
+or methods must also be literal values or compile time constants.
+.PP
+For example, these are both fine:
+.PP
+.Vb 2
+\&    # literal argument
+\&    [% constants.col.keys.sort.join(', ') %]
+.Ve
+.PP
+.Vb 2
+\&    # constant argument
+\&    [% constants.col.keys.sort.join(constants.joint) %]
+.Ve
+.PP
+But this next example will raise an error at parse time because
+\&\f(CW\*(C`joint\*(C'\fR is a runtime variable and cannot be determined at compile
+time.
+.PP
+.Vb 2
+\&    # ERROR: runtime variable argument!
+\&    [% constants.col.keys.sort.join(joint) %]
+.Ve
+.PP
+The \f(CW\*(C`CONSTANTS_NAMESPACE\*(C'\fR option can be used to provide a different 
+namespace prefix for constant variables.  For example:
+.PP
+.Vb 7
+\&    my $tt = Template\->new({
+\&        CONSTANTS => {
+\&            version => 3.14,
+\&            # ...etc...
+\&        },
+\&        CONSTANTS_NAMESPACE => 'const',
+\&    });
+.Ve
+.PP
+Constants would then be referenced in templates as:
+.PP
+.Vb 1
+\&    [% const.version %]
+.Ve
+.SH "Special Variables"
+.IX Header "Special Variables"
+A number of special variables are automatically defined by the Template 
+Toolkit.
+.Sh "template"
+.IX Subsection "template"
+The \f(CW\*(C`template\*(C'\fR variable contains a reference to the main template being
+processed, in the form of a Template::Document object. This variable is
+correctly defined within \f(CW\*(C`PRE_PROCESS\*(C'\fR, \f(CW\*(C`PROCESS\*(C'\fR and \f(CW\*(C`POST_PROCESS\*(C'\fR
+templates, allowing standard headers, footers, etc., to access metadata items
+from the main template. The \f(CW\*(C`name\*(C'\fR and \f(CW\*(C`modtime\*(C'\fR metadata items are
+automatically provided, giving the template name and modification time in
+seconds since the epoch.
+.PP
+Note that the \f(CW\*(C`template\*(C'\fR variable always references the top-level
+template, even when processing other template components via \f(CW\*(C`INCLUDE\*(C'\fR,
+\&\f(CW\*(C`PROCESS\*(C'\fR, etc.
+.Sh "component"
+.IX Subsection "component"
+The \f(CW\*(C`component\*(C'\fR variable is like \f(CW\*(C`template\*(C'\fR but always contains a
+reference to the current, innermost template component being processed.
+In the main template, the \f(CW\*(C`template\*(C'\fR and \f(CW\*(C`component\*(C'\fR variable will 
+reference the same Template::Document object.  In any other template
+component called from the main template, the \f(CW\*(C`template\*(C'\fR variable 
+will remain unchanged, but \f(CW\*(C`component\*(C'\fR will contain a new reference
+to the current component.
+.PP
+This example should demonstrate the difference:
+.PP
+.Vb 2
+\&    $template\->process('foo')
+\&        || die $template\->error(), "\en";
+.Ve
+.PP
+\&\fIfoo\fR template:
+.PP
+.Vb 3
+\&    [% template.name %]         # foo
+\&    [% component.name %]        # foo
+\&    [% PROCESS footer %]
+.Ve
+.PP
+\&\fIfooter\fR template:
+.PP
+.Vb 2
+\&    [% template.name %]         # foo
+\&    [% component.name %]        # footer
+.Ve
+.PP
+Additionally, the \f(CW\*(C`component\*(C'\fR variable has two special fields:
+\&\f(CW\*(C`caller\*(C'\fR and \f(CW\*(C`callers\*(C'\fR.  \f(CW\*(C`caller\*(C'\fR contains the name of the template
+that called the current template (or undef if the values of \f(CW\*(C`template\*(C'\fR
+and \f(CW\*(C`component\*(C'\fR are the same).  \f(CW\*(C`callers\*(C'\fR contains a reference to a
+list of all the templates that have been called on the road to calling
+the current component template (like a call stack), with the
+outer-most template first.
+.PP
+Here's an example:
+.PP
+\&\fIouter.tt2\fR template:
+.PP
+.Vb 4
+\&    [% component.name %]        # 'outer.tt2'
+\&    [% component.caller %]      # undef
+\&    [% component.callers %]     # undef
+\&    [% PROCESS 'middle.tt2' %]
+.Ve
+.PP
+\&\fImiddle.tt2\fR template:
+.PP
+.Vb 4
+\&    [% component.name %]        # 'middle.tt2'
+\&    [% component.caller %]      # 'outer.tt2'
+\&    [% component.callers %]     # [ 'outer.tt2' ]
+\&    [% PROCESS 'inner.tt2' %]
+.Ve
+.PP
+\&\fIinner.tt2\fR template:
+.PP
+.Vb 3
+\&    [% component.name %]        # 'inner.tt2'
+\&    [% component.caller %]      # 'middle.tt2'
+\&    [% component.callers %]     # [ 'outer.tt2', 'middle.tt2' ]
+.Ve
+.Sh "loop"
+.IX Subsection "loop"
+Within a \f(CW\*(C`FOREACH\*(C'\fR loop, the \f(CW\*(C`loop\*(C'\fR variable references the 
+Template::Iterator object responsible for controlling the loop.
+.PP
+.Vb 4
+\&    [% FOREACH item = [ 'foo', 'bar', 'baz' ] \-%]
+\&       [% "Items:\en" IF loop.first \-%]
+\&       [% loop.count %]/[% loop.size %]: [% item %]
+\&    [% END %]
+.Ve
+.Sh "error"
+.IX Subsection "error"
+Within a \f(CW\*(C`CATCH\*(C'\fR block, the \f(CW\*(C`error\*(C'\fR variable contains a reference to the 
+Template::Exception object thrown from within the \f(CW\*(C`TRY\*(C'\fR block.  The 
+\&\f(CW\*(C`type\*(C'\fR and \f(CW\*(C`info\*(C'\fR methods can be called or the variable itself can 
+be printed for automatic stringification into a message of the form
+"\f(CW\*(C`$type error \- $info\*(C'\fR".  See Template::Exception for further details.
+.PP
+.Vb 5
+\&    [% TRY %]
+\&       ...
+\&    [% CATCH %]
+\&       [% error %]
+\&    [% END %]
+.Ve
+.Sh "content"
+.IX Subsection "content"
+The \f(CW\*(C`WRAPPER\*(C'\fR method captures the output from a template block and then 
+includes a named template, passing the captured output as the 'content'
+variable.
+.PP
+.Vb 4
+\&    [% WRAPPER box %]
+\&    Be not afeard; the isle is full of noises,
+\&    Sounds and sweet airs, that give delight and hurt not.
+\&    [% END %]
+.Ve
+.PP
+.Vb 5
+\&    [% BLOCK box %]
+\&    <blockquote class="prose">
+\&      [% content %]
+\&    </blockquote>
+\&    [% END %]
+.Ve
+.SH "Compound Variables"
+.IX Header "Compound Variables"
+Compound 'dotted' variables may contain any number of separate
+elements.  Each element may evaluate to any of the permitted variable
+types and the processor will then correctly use this value to evaluate
+the rest of the variable.  Arguments may be passed to any of the
+intermediate elements.
+.PP
+.Vb 1
+\&    [% myorg.people.sort('surname').first.fullname %]
+.Ve
+.PP
+Intermediate variables may be used and will behave entirely as expected.
+.PP
+.Vb 2
+\&    [% sorted = myorg.people.sort('surname') %]
+\&    [% sorted.first.fullname %]
+.Ve
+.PP
+This simplified dotted notation has the benefit of hiding the
+implementation details of your data.  For example, you could implement
+a data structure as a hash array one day and then change it to an
+object the next without requiring any change to the templates.