Template Toolkit(русская редакция) |
|
||
|
|||
Template::Plugin |
|
ОБЗОР |
[ Индекс ] [ Модули ] [ Наверх ] |
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;
} |
ОПИСАНИЕ |
[ Индекс ] [ Модули ] [ Наверх ] |
"Плагин" Template Toolkit это модуль Perl, который находится в определенном пространстве имен пакетов (например, Template::Plugin::*) и соответствует формальному стандарту, позволяющему загрузить и использовать его автоматически. Модуль Template::Plugin определяет базовый класс, из которого можно произвести другие модули плагинов. Плагин не обязательно должен быть производным от Template::Plugin, но должен по крайней мере соответствовать его объектно-ориентированному интерфейсу. Рекомендуется создавать плагины в собственном пространстве имен пакетов во избежание конфликта с плагинами библиотеки. Например: package MyOrg::Template::Plugin::FooBar; Используйте опцию PLUGIN_BASE, чтобы определить используемое пространство имен. Например: use Template;
my $template = Template->new({
PLUGIN_BASE => 'MyOrg::Template::Plugin',
}); |
API ПЛАГИНОВ |
[ Индекс ] [ Модули ] [ Наверх ] |
Следующие методы образуют базовый интерфейс между Template Toolkit и модулями плагинов.
|
ВНУТРЕННЕЕ ВОЛШЕБСТВО |
[ Индекс ] [ Модули ] [ Наверх ] |
Объект Template::Context, который управляет загрузкой и использованием плагинов вызывает методы new() и error() вместе с именем пакета, возвращаемым методом load(). В терминах псевдо-кода это может выглядеть примерно так: $class = MyPlugin->load($context); # возвращает 'MyPlugin' $object = $class->new($context, @params) # MyPlugin->new(...)
|| die $class->error(); # MyPlugin->error()
Вместо этого метод load() может возвратить связанную ссылку на объект. В этом случае new() и error() дальше будут вызываться как объектные методы этого прототипа. package YourPlugin; sub load {
my ($class, $context) = @_;
bless {
_CONTEXT => $context,
}, $class;
}
sub new {
my ($self, $context, @params) = @_;
return $self;
}
В этом примере мы реализовали плагин 'Singleton' (название плагина дословно переводится "единственный экземпляр" - прим. переводчика). При вызове load() создается один объект и он просто возвращает самого себя при каждом вызове new(). Другая реализация может потребовать создания индивидуальных объектов на каждый вызов new(), но каждый объект должен разделять ссылку на какой-то другой объект, чтобы поддерживать закешированные данные, дескрипторы базы данных и т.п. Следующий пример демонстрирует принцип в псевдо-коде. 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(@_);
}
Когда плагин загружается, создается экземпляр MyServer. Метод new() вызываемый у этого объекта, создает и возвращает объект MyClient, который способен связываться с создавшим его MyServer. |
ДЕЛЕГИРОВАНИЕ В Template::Plugin |
[ Индекс ] [ Модули ] [ Наверх ] |
Начиная с версии 2.01, модуль Template::Plugin более не предоставляет метод AUTOLOAD для передачи управления другим объектам и классам. Это была плохо спроектированная возможность, которая порождала больше проблем, чем решала. Вы можете легко добавить свой метод AUTOLOAD, чтобы выполнять делегирование, если Вам это необходимо. |
АВТОР |
[ Индекс ] [ Модули ] [ Наверх ] |
Энди Уардли (Andy Wardley <abw@andywardley.com>) |
ВЕРСИЯ |
[ Индекс ] [ Модули ] [ Наверх ] |
2.66, поставляется в составе Template Toolkit версии 2.14, дата релиза - 4 октября 2004. |
АВТОРСКИЕ ПРАВА |
[ Индекс ] [ Модули ] [ Наверх ] |
Copyright (C) 1996-2004 Andy Wardley. All Rights Reserved. Copyright (C) 1998-2002 Canon Research Centre Europe Ltd. Этот модуль является свободно-распространяемым программным обеспечением; вы можете распространять и/или модифицировать его на тех же условиях, что и Perl. |
СМОТРИ ТАКЖЕ |
[ Индекс ] [ Модули ] [ Наверх ] |