2011-01-27 10 views
5

Chcę napisać aplikację, którą można rozszerzyć za pomocą wtyczek, używając Perla i Moose. Wiem, że istnieje kilka modułów Moose do pisania wtyczek i wiem, że są inne sposoby.Jaki jest najlepszy sposób na zbudowanie systemu wtyczek dla aplikacji Moose?

Jakie są moje opcje? i co powinienem o nich wiedzieć? o czym powinienem pomyśleć przed wdrożeniem systemu wtyczek?

+1

Czy obejrzałeś [Module :: Pluggable] (http://search.cpan.org/~simonw/Module-Pluggable-3.9/lib/Module/Pluggable.pm)? –

+0

@Len Przeglądałem różne moduły w jednym punkcie, ale wolę uczyć się od społeczności. Myślę, że znalazłem co najmniej 3 różne i przeczytałem o innych sposobach. Nie wiem, dlaczego istnieje tak wiele sposobów i jaka jest różnica. TIMTOWTDI, ale zwykle istnieje powód istnienia więcej niż jednego sposobu. – xenoterracide

Odpowiedz

5

Istnieje kilka sposobów na zapewnienie rozszerzalności; pozwól użytkownikowi na zastosowanie ról do klasy lub pozwól, aby przekazywały małe obiekty, które wykonują interesujące rzeczy (delegaci). Delegaci wykonują zadania lepsze niż role, ale będą wymagać od ciebie planowania całej rozszerzalności. Role umożliwiają więcej zachowań ad-hoc.

Oto dwie dystrybucje CPAN, które biorą każde podejście:

Delegatów: AnyEvent::Subprocess

Role: Devel::REPL

role wtyczki są realizowane z MooseX::Object::Pluggable.

Delegaci są wdrażani w dowolny sposób; wzór przechodzi instancję klasy A, dokłada pewną rolę R do klasy C, a następnie Klasa C delegatów A. Oto przykład:

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; 
} 

Wtedy to wykorzystać jak:

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

Aby zmienić sposób sortowania, wystarczy utworzyć nową klasę, która spełnia rolę Compare, a następnie przekazać instancję do konstruktora Sort. Natychmiastowa elastyczność!

+0

Czy wiesz, gdzie jest różnica pomiędzy MooseX :: Object :: Pluggable i Module :: Pluggable? – xenoterracide

+0

@xenoterracide MooseX :: Object :: Pluggable stosuje role do bieżącej klasy na podstawie przestrzeni nazw. Moduł :: Pluggable udostępnia listę obszarów nazw/instancji. Są prawie całkowicie inne niż część "look up space". – perigrin

+0

+1 za świetny przykład – qodeninja

Powiązane problemy