2011-01-27 14 views
5

Quiero escribir una aplicación que se puede extender a través de complementos, usando Perl y Moose. Sé que hay algunos módulos de Moose para escribir complementos y sé que hay otras maneras.¿Cuál es la mejor opción para construir un sistema de complemento para una aplicación Moose?

¿Cuáles son mis opciones? y ¿qué debería saber sobre ellos? cualquier cosa que debería pensar antes de implementar un sistema de complemento?

+1

¿Ha mirado a [Module :: Pluggable] (http://search.cpan.org/~simonw/Module-Pluggable-3.9/lib/Module/Pluggable.pm)? –

+0

@Len Eché un vistazo a diferentes módulos a la vez, pero prefiero aprender de la experiencia de las comunidades. Creo que encontré al menos 3 diferentes y también leo sobre otras formas. No sé por qué existen tantas formas y cuál es la diferencia. TIMTOWTDI, pero generalmente hay una razón para que exista más de una manera. – xenoterracide

Respuesta

5

Hay algunas maneras de proporcionar extensibilidad; permita al usuario aplicar roles a su clase, o permita que pasen objetos pequeños que hagan cosas interesantes (delegados). Los delegados se desempeñan mejor que los roles, pero requerirán que planifique de antemano toda la extensibilidad. Los roles permiten más comportamientos ad-hoc.

Éstos son dos distribuciones de CPAN que tienen cada enfoque:

Delegados: AnyEvent::Subprocess

Roles: Devel::REPL

papeles Plugin se implementan con MooseX::Object::Pluggable.

Los delegados se implementan como usted quiera; el patrón está pasando una instancia de una clase A que, hace algún papel R para la clase C, y luego los delegados de clase C a A. He aquí un ejemplo:

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

continuación, utiliza esto como:

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

Si desea que cambie la forma en que Sort funciona, solo cree una nueva clase que tenga el rol Compare y luego pase una instancia al constructor de Sort. Flexibilidad instantánea!

+0

si existe la posibilidad de que conozca la diferencia entre MooseX :: Object :: Pluggable y Module :: ¿Enchufable? – xenoterracide

+0

@xenoterracide MooseX :: Object :: Pluggable aplica roles a la clase actual en función de un espacio de nombres. Module :: Pluggable proporciona una lista de espacios de nombres/instancias. Son casi completamente diferentes más allá de la parte de "buscar espacios de nombres". – perigrin

+0

+1 para el impresionante ejemplo – qodeninja

Cuestiones relacionadas