>Есть некая программа, которая мало что умеет, но с помощью кода не 
>включенного в саму программу может делать больше. Например: 
>дополнительная обработка результата основной программы.

>Не могли бы Вы показать код плагина который так подключается?


Как уже писали, это решается при помощи интерфейса, в случае 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 mailing list
[email protected] | http://moscow.pm.org

Ответить