2010-07-14 3 views
7

Что такое правильный способ создания экземпляра из другого объекта Moose? На практике я видел это сделано множество способов:Правильный способ создания объекта Moose из другого объекта Moose?

$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() 

И, то, что если у вас есть traits? Есть ли прозрачный способ поддержать это? Работаете ли вы с anonymous classes?

+1

Как и в случае создания «клонирования» объекта или нового экземпляра того же объекта? –

+0

новый экземпляр того же объекта. –

+1

Если у этого экземпляра есть роли, вы хотите их сохранить? – Schwern

ответ

6

Из вашего выбора $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 

Надеюсь, что это поможет.