Template::Plugin - Base class for Template Toolkit plugins
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; }
The Template::Plugin 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.
It is recommended that you create plugins in your own package namespace to avoid conflict with toolkit plugins. e.g.
package MyOrg::Template::Plugin::FooBar;
Use the PLUGIN_BASE option to specify the namespace that you use. e.g.
use Template; my $template = Template->new({ PLUGIN_BASE => 'MyOrg::Template::Plugin', });
package MyPlugin;
sub load { # called as MyPlugin->load($context) my ($class, $context) = @_; return $class; # returns 'MyPlugin' }
sub new { # called as MyPlugin->new($context) my ($class, $context, @params) = @_; bless { _CONTEXT => $context, }, $class; # returns blessed MyPlugin object }
sub new { my ($class, $context, $dsn) = @_;
return $class->error('No data source specified') unless $dsn;
bless { _DSN => $dsn, }, $class; }
...
my $something = MyModule->new() || die MyModule->error(), "\n";
$something->do_something() || die $something->error(), "\n";
$class = MyPlugin->load($context); # returns 'MyPlugin'
$object = $class->new($context, @params) # MyPlugin->new(...) || die $class->error(); # MyPlugin->error()
The load() method may alterately return a blessed reference to an object instance. In this case, new() and error() are then called as object methods against that prototype instance.
package YourPlugin;
sub load { my ($class, $context) = @_; bless { _CONTEXT => $context, }, $class; }
sub new { my ($self, $context, @params) = @_; return $self; }
In this example, we have implemented a 'Singleton' plugin. One object gets created when load() is called and this simply returns itself for each call to new().
Another implementation might require individual objects to be created for every call to new(), 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.
package MyServer;
sub load { my ($class, $context) = @_; bless { _CONTEXT => $context, _CACHE => { }, }, $class; }
sub new { my ($self, $context, @params) = @_; MyClient->new($self, @params); }
sub add_to_cache { ... }
sub get_from_cache { ... }
package MyClient;
sub new { my ($class, $server, $blah) = @_; bless { _SERVER => $server, _BLAH => $blah, }, $class; }
sub get { my $self = shift; $self->{ _SERVER }->get_from_cache(@_); }
sub put { my $self = shift; $self->{ _SERVER }->add_to_cache(@_); }
When the plugin is loaded, a MyServer instance is created. The new() method is called against this object which instantiates and returns a MyClient object, primed to communicate with the creating MyServer.
<http://www.andywardley.com/|http://www.andywardley.com/>
Copyright (C) 1996-2004 Andy Wardley. All Rights Reserved. Copyright (C) 1998-2002 Canon Research Centre Europe Ltd.
This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself.
Закладки на сайте Проследить за страницей |
Created 1996-2024 by Maxim Chirkov Добавить, Поддержать, Вебмастеру |