[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