¿Existe alguna manera más simple o mejor (= > más fácil de mantener) de usar Perl y Moose
para crear instancias de clases basadas en datos entrantes?¿Cómo puedo codificar una fábrica en Perl y Moose?
El siguiente código es una muestra reducida de un proyecto en el que estoy trabajando.
package FooBar;
use Moose;
has 'SUBCLASS' =>('isa'=>'Str',required=>'1',is=>'ro');
has 'MSG' =>('isa'=>'Str',required=>'1',is=>'ro');
sub BUILD {
my $self = shift;
my ($a)[email protected]_;
bless($self,$a->{SUBCLASS})
}
sub Hi {
my $self=shift;
print "Hi, I'm a " . ref($self) ." and I say [". $self->MSG()."]\n";
}
package Foo;
use Moose;
extends ("FooBar");
package Bar;
use Moose;
extends ("FooBar");
package main;
use strict;
use warnings;
for my $line (<DATA>) {
my ($case,$msg)=split(/[\n\r,]\s*/,$line);
FooBar->new(SUBCLASS=>$case,MSG=>$msg)->Hi();
}
__DATA__
Foo, First Case
Bar, Second Case
EDITAR: Simplemente me ocurrió que esto es más o menos lo que sucede cuando se llama a la DBI. En función de los parámetros que lo pasa, utilizará el código completamente diferente, manteniendo a (sobre todo) interfaz consistente
gracias, me tomará un tiempo para grok :-) – lexu
** tiene [qw (SUBCLASE MSG)] => (es => 'ro', requerido => 1); ** buen truco ... pero "poco intuitivo" para cualquiera que no esté familiarizado con perl .. – lexu
No, no lo es. Es parte de la API de Moose y no tiene nada que ver con Perl. (Si quisiera ser poco intuitivo, escribiría "tiene $ _ => (...) para qw/SUBCLASS MSG /". Pero, por supuesto, todos saben lo que hace esto también.) – jrockway