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!
¿Ha mirado a [Module :: Pluggable] (http://search.cpan.org/~simonw/Module-Pluggable-3.9/lib/Module/Pluggable.pm)? –
@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