Estoy intentando escribir un rol de singleton usando Perl y Moose. Entiendo que un módulo MooseX :: Singleton está disponible pero siempre hay resistencia cuando se requiere otro módulo CPAN para nuestro proyecto. Después de probar esto y tener un pequeño problema, me gustaría entender POR QUÉ mi método no funciona. El papel Singleton he escrito es el siguiente:Roles de Singleton en Moose
package Singleton;
use Moose::Role;
my $_singleInstance;
around 'new' => sub {
my $orig = shift;
my $class = shift;
if (not defined $_singleInstance){
$_singleInstance = $class->$orig(@_);
}
return $_singleInstance;
};
sub getInstance
{
return __PACKAGE__->new();
}
1;
Esto parece funcionar encontrar cuando sólo una clase utiliza el papel Singleton. Sin embargo, cuando dos clases (ClassA y ClassB, por ejemplo) ambas consumen el rol de Singleton aparece, ya que ambas se refieren a una variable compartida $ _singleInstance. Si llamo a ClassA-> getInstance, devuelve una referencia a un objeto ClassA. Si llamo a ClassB-> getInstance algún tiempo después en el mismo script, devuelve una referencia a un objeto de tipo ClassA (aunque llamé claramente al método getInstance para ClassB). Si no uso un rol y realmente copio y pego el código del rol de Singleton en ClassA y ClassB, parece funcionar bien. ¿Que está pasando aqui?
Te das cuenta de que envolver 'new' solo es pedir un mundo de dolor, ¿verdad? – Ether