Что корректный путь состоит в том, чтобы создать экземпляр из другого объекта Американского лося? На практике я видел сделанные многочисленные пути:
$obj->meta->name->new()
$obj->new() ## which has been deprecated and undeprecated
(blessed $obj)->new()
-- and, its bastard variant: (ref $obj)->new()
$obj->meta->new_object()
И, затем что, если у Вас есть черты? Существует ли прозрачный способ поддерживать это? Какой-либо из них работает с анонимными классами?
Из ваших вариантов, $obj->meta->name->new()
или (blessed $obj)->new()
являются самыми безопасными.
При реализации трейтов вы создаете анонимный подкласс, применяете роли к этому подклассу и возвращаете экземпляр в этот подкласс. Это означает, что любое из этих решений будет прекрасно работать с трейтами. В Perl нет действительно анонимных подклассов (каждый пакет должен иметь пространство имен), Moose обходит это, создавая имя в общем пространстве имен для анонимных классов.
Если бы вы потратили секунду на пример кода, вы бы увидели это в действии.
$perl -Moose -E'with q[MooseX::Traits];
package Role; use Moose::Role;
package main; say Class->with_traits(q[Role])->new->meta->name'
MooseX::Traits::__ANON__::SERIAL::1
Надеюсь, это поможет.