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. |
СМОТРИ ТАКЖЕ |
[ Индекс ] [ Модули ] [ Наверх ] |