Правильный способ создания объекта Moose из другого объекта Moose? - PullRequest
7 голосов
/ 15 июля 2010

Каков правильный способ создания экземпляра из другого объекта 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()

И что тогда, если у вас есть черты ? Есть ли прозрачный способ поддержать это? Работают ли какие-либо из них с анонимными классами ?

1 Ответ

6 голосов
/ 16 июля 2010

На ваш выбор, $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

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

...