<?php
define("ABS_PATH", $_SERVER['DOCUMENT_ROOT']);
include(ABS_PATH . "/head_nav.php");
include(ABS_PATH . "/middle.php");
?>
          <div class="section">
            <div class="toc-wrapper">
              <span class="toc-title">Contents:</span>
              <ul class="toc">
                  <li class=""><a href="#SYNOPSIS">SYNOPSIS</a></li>
                  <li class=""><a href="#DESCRIPTION">DESCRIPTION</a></li>
                  <li class=""><a href="#METHODS">METHODS</a></li>
                  <li class="sub"><a href="#method_load">load($context)</a></li>
                  <li class="sub"><a href="#method_new">new($context, @params)</a></li>
                  <li class="sub"><a href="#method_error">error($error)</a></li>
                  <li class=""><a href="#DEEPER_MAGIC">DEEPER MAGIC</a></li>
                  <li class=""><a href="#AUTHOR">AUTHOR</a></li>
                  <li class=""><a href="#COPYRIGHT">COPYRIGHT</a></li>
                  <li class=""><a href="#SEE_ALSO">SEE ALSO</a></li>
              </ul>
            </div>
          </div>
          
                <div class="pod">
            <div class="section">
              <div class="head">
                <h1 id="SYNOPSIS">SYNOPSIS</h1>
                <a href="#body" class="top" title="Back up to the top of the page" >Top</a>
              </div>
              <div class="body">
                <pre>package MyOrg::Template::Plugin::MyPlugin;
use base qw( Template::Plugin );
use Template::Plugin;
use MyModule;

sub new {
    my $class   = shift;
    my $context = shift;
    bless {
        ...
    }, $class;
}</pre>
              </div>
            </div>
            <div class="section">
              <div class="head">
                <h1 id="DESCRIPTION">DESCRIPTION</h1>
                <a href="#body" class="top" title="Back up to the top of the page" >Top</a>
              </div>
              <div class="body">
                <p>
                      A "plugin" for the Template Toolkit is simply a Perl module which exists
                      in a known package location (e.g. <code>Template::Plugin::*</code>) and
                      conforms to a regular standard, allowing it to be loaded and used
                      automatically.
                    </p>
                    <p>
                      The <code>Template::Plugin</code> module defines a base class from which
                      other plugin modules can be derived. A plugin does not have to be derived
                      from Template::Plugin but should at least conform to its object-oriented
                      interface.
                    </p>
                    <p>
                      It is recommended that you create plugins in your own package namespace
                      to avoid conflict with toolkit plugins. e.g.
                    </p>
                    <pre>package MyOrg::Template::Plugin::FooBar;</pre>
                    <p>
                      Use the <a href="../../manual/Config.php#section_PLUGIN_BASE">PLUGIN_BASE</a> option to specify the namespace
                      that you use. e.g.
                    </p>
                    <pre>use Template;
my $template = Template-&gt;new({ 
    PLUGIN_BASE =&gt; 'MyOrg::Template::Plugin',
});</pre>
              </div>
            </div>
            <div class="section">
              <div class="head">
                <h1 id="METHODS">METHODS</h1>
                <a href="#body" class="top" title="Back up to the top of the page" >Top</a>
              </div>
              <div class="body">
                <p>
                      The following methods form the basic interface between the Template
                      Toolkit and plugin modules.
                    </p>
                    <div class="subsection">
                  <div class="head">
                    <h2 id="method_load" class="method" onclick="switch_subsection(this)" title="Click title to show/hide sub-section content.">load($context)</h2>
                    <a href="#body" class="top" title="Back up to the top of the page" >Top</a>
                  </div>
                  <div class="body">
                    <p>
                          This method is called by the Template Toolkit when the plugin module is
                          first loaded. It is called as a package method and thus implicitly
                          receives the package name as the first parameter. A reference to the <a
                          href="../../modules/Template/Context.php">Template::Context</a>
                          object loading the plugin is also passed. The default behaviour for the
                          <code>load()</code> method is to simply return the class name. The
                          calling context then uses this class name to call the <code>new()</code>
                          package method.
                        </p>
                        <pre>package MyPlugin;

sub load {               # called as MyPlugin-&gt;load($context)
    my ($class, $context) = @_;
    return $class;       # returns 'MyPlugin'
}</pre>
                  </div>
                </div>    <div class="subsection">
                  <div class="head">
                    <h2 id="method_new" class="method" onclick="switch_subsection(this)" title="Click title to show/hide sub-section content.">new($context, @params)</h2>
                    <a href="#body" class="top" title="Back up to the top of the page" >Top</a>
                  </div>
                  <div class="body">
                    <p>
                          This method is called to instantiate a new plugin object for the
                          <code>USE</code> directive. It is called as a package method against the
                          class name returned by <a href="#method_load">load()</a>. A reference to
                          the <a href="../../modules/Template/Context.php">Template::Context</a> object creating the plugin is passed, along
                          with any additional parameters specified in the <code>USE</code>
                          directive.
                        </p>
                        <pre>sub new {                # called as MyPlugin-&gt;new($context)
    my ($class, $context, @params) = @_;
    bless {
        _CONTEXT =&gt; $context,
    }, $class;           # returns blessed MyPlugin object
}</pre>
                  </div>
                </div>    <div class="subsection">
                  <div class="head">
                    <h2 id="method_error" class="method" onclick="switch_subsection(this)" title="Click title to show/hide sub-section content.">error($error)</h2>
                    <a href="#body" class="top" title="Back up to the top of the page" >Top</a>
                  </div>
                  <div class="body">
                    <p>
                          This method, inherited from the <a href="../../modules/Template/Base.php">Template::Base</a> module, is used for reporting and returning
                          errors. It can be called as a package method to set/return the
                          <code>$ERROR</code> package variable, or as an object method to
                          set/return the object <code>_ERROR</code> member. When called with an
                          argument, it sets the relevant variable and returns <code>undef.</code>
                          When called without an argument, it returns the value of the variable.
                        </p>
                        <pre>package MyPlugin;
use base 'Template::Plugin';

sub new {
    my ($class, $context, $dsn) = @_;

    return $class-&gt;error('No data source specified')
        unless $dsn;

    bless {
        _DSN =&gt; $dsn,
    }, $class;
}

package main;

my $something = MyPlugin-&gt;new()
    || die MyPlugin-&gt;error(), "\n";

$something-&gt;do_something()
    || die $something-&gt;error(), "\n";</pre>
                  </div>
                </div>
              </div>
            </div>
            <div class="section">
              <div class="head">
                <h1 id="DEEPER_MAGIC">DEEPER MAGIC</h1>
                <a href="#body" class="top" title="Back up to the top of the page" >Top</a>
              </div>
              <div class="body">
                <p>
                      The <a href="../../modules/Template/Context.php">Template::Context</a> object that handles the loading and use of
                      plugins calls the <a href="#method_new">new()</a> and <a
                      href="#method_error">error()</a> methods against the package name
                      returned by the <a href="#method_load">load()</a> method. In pseudo-code
                      terms looks something like this:
                    </p>
                    <pre>$class  = MyPlugin-&gt;load($context);       # returns 'MyPlugin'

$object = $class-&gt;new($context, @params)  # MyPlugin-&gt;new(...)
    || die $class-&gt;error();               # MyPlugin-&gt;error()</pre>
                    <p>
                      The <a href="#method_load">load()</a> method may alterately return a
                      blessed reference to an object instance. In this case, <a
                      href="#method_new">new()</a> and <a href="#method_error">error()</a> are
                      then called as <i>object</i> methods against that prototype instance.
                    </p>
                    <pre>package YourPlugin;

sub load {
    my ($class, $context) = @_;
    bless {
        _CONTEXT =&gt; $context,
    }, $class;
}

sub new {
    my ($self, $context, @params) = @_;
    return $self;
}</pre>
                    <p>
                      In this example, we have implemented a 'Singleton' plugin. One object
                      gets created when <a href="#method_load">load()</a> is called and this
                      simply returns itself for each call to <a href="#method_new">new().</a>
                    </p>
                    <p>
                      Another implementation might require individual objects to be created for
                      every call to <a href="#method_new">new(),</a> but with each object
                      sharing a reference to some other object to maintain cached data,
                      database handles, etc. This pseudo-code example demonstrates the
                      principle.
                    </p>
                    <pre>package MyServer;

sub load {
    my ($class, $context) = @_;
    bless {
        _CONTEXT =&gt; $context,
        _CACHE   =&gt; { },
    }, $class;
}

sub new {
    my ($self, $context, @params) = @_;
    MyClient-&gt;new($self, @params);
}

sub add_to_cache   { ... }

sub get_from_cache { ... }

package MyClient;

sub new {
    my ($class, $server, $blah) = @_;
    bless {
        _SERVER =&gt; $server,
        _BLAH   =&gt; $blah,
    }, $class;
}

sub get {
    my $self = shift;
    $self-&gt;{ _SERVER }-&gt;get_from_cache(@_);
}

sub put {
    my $self = shift;
    $self-&gt;{ _SERVER }-&gt;add_to_cache(@_);
}</pre>
                    <p>
                      When the plugin is loaded, a <code>MyServer</code> instance is created.
                      The <a href="#method_new">new()</a> method is called against this object
                      which instantiates and returns a <code>MyClient</code> object, primed to
                      communicate with the creating <code>MyServer</code>.
                    </p>
              </div>
            </div>
            <div class="section">
              <div class="head">
                <h1 id="AUTHOR">AUTHOR</h1>
                <a href="#body" class="top" title="Back up to the top of the page" >Top</a>
              </div>
              <div class="body">
                <p>
                      Andy Wardley &lt;abw@wardley.org&gt; <a
                      href="https://wardley.org/">https://wardley.org/</a>
                    </p>
              </div>
            </div>
            <div class="section">
              <div class="head">
                <h1 id="COPYRIGHT">COPYRIGHT</h1>
                <a href="#body" class="top" title="Back up to the top of the page" >Top</a>
              </div>
              <div class="body">
                <p>
                      Copyright (C) 1996-2007 Andy Wardley. All Rights Reserved.
                    </p>
                    <p>
                      This module is free software; you can redistribute it and/or modify it
                      under the same terms as Perl itself.
                    </p>
              </div>
            </div>
            <div class="section">
              <div class="head">
                <h1 id="SEE_ALSO">SEE ALSO</h1>
                <a href="#body" class="top" title="Back up to the top of the page" >Top</a>
              </div>
              <div class="body">
                <p>
                      <a href="../../modules/Template.php">Template</a>, <a href="../../modules/Template/Plugins.php">Template::Plugins</a>, <a href="../../modules/Template/Context.php">Template::Context</a>
                    </p>
              </div>
            </div>
            
            </div>
<?php include(ABS_PATH . "/footer.php"); ?>
