2010-07-14 7 views
7

¿Cuál es la forma correcta de para crear una instancia de otro objeto Moose? En la práctica he visto este hecho numerosas maneras:¿Manera correcta de instanciar un objeto Moose de otro objeto 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() 

Y, a continuación, lo que si tiene traits? ¿Hay una manera transparente de apoyar eso? ¿Alguno de estos funciona con anonymous classes?

+1

Como en, creando un 'clon' del objeto, o una nueva instancia del mismo objeto? –

+0

nueva instancia del mismo objeto. –

+1

Si esa instancia tiene roles, ¿quieres conservarlos? – Schwern

Respuesta

6

De sus elecciones, $obj->meta->name->new() o (blessed $obj)->new() son las más seguras.

La forma en que se implementan los rasgos, se crea una subclase anónima y se aplican los roles a esa subclase y se reutiliza la instancia en esa subclase. Esto significa que cualquiera de estas soluciones funcionará bien con los rasgos. Perl carece de subclases verdaderamente anónimas (cada paquete debe tener espacio de nombres), Moose trabaja en torno a esto creando un nombre en un espacio de nombres genérico para clases anónimas.

Si hubiera tardado un segundo para probar algún código de ejemplo, vería esto en acción.

$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 

Hope that helps.

Cuestiones relacionadas