Я пытаюсь написать одноэлементную роль с помощью Perl и Moose. Я понимаю, что модуль MooseX :: Singleton доступен, но всегда есть сопротивление, когда требуется другой модуль CPAN для нашего проекта. Попробовав это и немного потрудившись, я хотел бы понять, ПОЧЕМУ мой метод не работает. Одноточечно роль, которую я написал следующим образом:Singleton Роли в 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;
Это, кажется, работает поиск, когда только один класс использует одноплодной роль. Однако, когда два класса (ClassA и ClassB, например) потребляют роль Singleton, они появляются, поскольку оба они ссылаются на общую переменную $ _singleInstance. Если я вызываю ClassA-> getInstance, он возвращает ссылку на объект ClassA. Если я вызову ClassB-> getInstance когда-нибудь позже в том же скрипте, он вернет ссылку на объект типа ClassA (хотя я явно назвал метод getInstance для ClassB). Если я не использую роль и на самом деле копирую и вставляю код из роли Singleton в ClassA и ClassB, он работает нормально. Что тут происходит?
Вы понимаете, что упаковка «нового» просто требует мира обиды, не так ли? – Ether