[Moscow.pm] Плагины в perl программах
Шогин Михаил
mshogin на gmail.com
Пт Мар 12 06:32:41 PST 2010
>Есть некая программа, которая мало что умеет, но с помощью кода не
>включенного в саму программу может делать больше. Например:
>дополнительная обработка результата основной программы.
>Не могли бы Вы показать код плагина который так подключается?
Как уже писали, это решается при помощи интерфейса, в случае Perl -
"соглашения". (Хотя если заюзать Moose :) )
sub handle
{
my ($self, $request) = @_;
# MiddleWare классы должны реализовывать middleware_handle, не
изменяя $request, только добаляя новые аттрибуты
for my $plugin (@{$self->{plugins}}){
eval "require $plugin ";
$plugin->middleware_handle($request);
}
return $request;
}
В данном случае, все плагины должны реализовывать интерфейс (назовем его
IMiddleWare, это наше "соглашение"),
который предоставляет метод middleware_handle, и соответственно каждый
плагин должен его реализовать.
Само собой создавать интерфейс мы не будем, смысла нет, так что в месте
подключения плагина, пишем комент о том что требуется реализация метода.
У нас это место - настройки проекта. Выглядит примерно так
# запускаются перед основной обработкой каждого запроса
# если модуль возвращает объект Response, обработка запроса останавливается
# принимает объект Request, изменять атрибуты запрещено, только
инициализация или добавление
sub middle_ware {
return [
'cache::Cache',
'auth::Auth',
'auth::OldAuth'
];
}
Мне нравится как это реализовано в Django, собсно из него и скрындино ))
Так что если нет ничего то можно почитать
http://docs.djangoproject.com/en/dev/topics/http/middleware/
Подробная информация о списке рассылки Moscow-pm