PASSING SUBS run_template ( { dog_years => sub {$_[0] * 7]} } ) my dog is [% dog_year(5) %] PLUGINS create a sub routine Package Matcher use base qw(Template::Plugin::Procedure); sub my_stuff{}} [%use Matcher%] [% Matcher.my_stuff %] OBJECT create a sub routine Package Matcher use base qw(Template::Plugin); sub my_stuff{}} [%use bit - HTMLBit "" %] GOTCHAs => and , not the same . => builds hasref , builds list CONTEXT $foobar = $stash->get("foo.bar"); set stash to, sub give nrew then no need for package.sub after the use. You can just call sub LOAD load method auto loads passed in class name, returns new class VMETHODS Every single object has them scalar.length [%password.length%] #list ops can be promoted to 1 list $Template::Stash.SCALAR_OPS->{test} = sub test { my $stringlist, $regex = @_ } EXECEPTIONs die with an Objects die Template::Exception->new ('my_category', 'not enough params'); [%try [%catch 'my_category' [%catch [%end %] FILTERS [% use URIFind %] [% Filter $URIFind "FTP" %] [% END %] Template Pl,ugin Filter URI::Find package T::P::URIFinf if args our $DYNAMIC=1; #passes args and options sub fitler { my (self text [args option])= @_ ; set self->{uriFind} return self->{uriFind}; ... find URIs } VIEWs [%View htmlv%] [%BLOCK liststart %]
    [% END %] [% END %] [%View htmlv%][% END %] [%htmlv.liststart%] v=htmlv [% v.liststart %] [% myview.display($myWackyWackyObject)%] the Present Methof map block to tag names --> XSL like wow