Каков наилучший вариант для создания системы плагинов для приложения Moose? - PullRequest
5 голосов
/ 27 января 2011

Я хочу написать приложение, которое можно расширить с помощью плагинов, используя Perl и Moose . Я знаю, что есть несколько модулей Moose для написания плагинов, и я знаю, что есть и другие способы.

Какие у меня варианты? и что мне о них знать? что-нибудь, о чем я должен подумать перед внедрением системы плагинов?

1 Ответ

5 голосов
/ 31 января 2011

Есть несколько способов обеспечить расширяемость;разрешите пользователю применять роли к вашему классу или разрешить ему передавать небольшие объекты, которые делают интересные вещи (делегаты).Делегаты работают лучше, чем роли, но вам потребуется заранее спланировать всю расширяемость.Роли допускают больше специальных действий.

Вот два дистрибутива CPAN, которые используют каждый подход:

Делегаты: AnyEvent :: Subprocess

Роли: Devel :: REPL

Роли плагина реализованы с помощью MooseX :: Object :: Pluggable .

Делегаты реализованы так, как вам нравится;шаблон передает экземпляр класса A, который выполняет некоторую роль R, в класс C, а затем делегирует класс C в A. Вот пример:

package Compare;
use Moose::Role;
requires 'compare';


package SpaceshipCompare;
use Moose;
with 'Compare';  

sub compare { my ($a, $b) = @_; return $a <=> $b }

package Sort;
use Moose;

has 'comparer' => (
    is       => 'ro',
    does     => 'Compare',
    handles  => 'Compare',
    required => 1,
);

sub my_sort {
    my ($self, @list) = @_;
    return sort { $self->compare($a, $b) } @list;
}

Затем вы используете это как:

my $sorter = Sort->new( comparer => SpaceshipCompare->new );
my @sorted = $sorter->my_sort("1one", "0", "43");

Если вы хотите изменить способ работы Sort, вы просто создаете новый класс, выполняющий роль Compare, а затем передаете экземпляр конструктору Sort.Мгновенная гибкость!

...