Как мне создать новый класс Moose и создать экземпляр объекта этого класса во время выполнения? - PullRequest
1 голос
/ 10 марта 2010

После создания метакласса с использованием Moose::Meta::Class->create как мне создать настоящий класс Moose с этим классом в качестве метакласса? (Мне нужно также создать метакласс, потому что я также хочу применить к нему некоторые роли.)

Ответы [ 2 ]

3 голосов
/ 10 марта 2010

Метакласс - это, конечно, класс. Если вы хотите экземпляр этого класса, просто выполните:

my $instance = $meta->name->new

Возможно, вам также понадобится убедиться, что $ meta не будет собрана слишком рано. Как правило, вы делаете это:

$meta->add_method( meta => sub { $meta } );

Это сохранит метакласс, но вы потеряете класс, если не будете осторожны. Если вы сделаете это только один раз, это не будет иметь значения; если ты будешь делать это тысячи раз, ты попадешь в беду.

Гораздо лучше использовать что-то более высокого уровня, например Moose::Meta::Class::create_anon_class или MooseX::Traits.

3 голосов
/ 10 марта 2010

Не уверен, что это отвечает на этот или другой ваш SO вопрос How do I build a Moose class at runtime, add a method to it, apply a role to it and instantiate it once? How would you approach this? на Создание класса Moose во время выполнения и настройка его , но посмотрите на:

Он может делать то, что вы хотите.Или вы можете найти полезным заглянуть в нашу работу.

В документации приводятся ссылки на посты в блоге, которые я сделал, когда разбирался в построении этого модуля, так что вы также можете найти их полезными.

Вот краткий пример кода MooseX :: SingletonMethod:

{
    package Foo;
    use MooseX::SingletonMethod;
    sub bar { say 'bar' }
}

my $baz = Foo->new;
my $bar = Foo->new;

$baz->add_singleton_method( baz => sub { say 'baz' } );

$baz->bar;   # => bar
$bar->bar;   # => bar

$baz->baz;   # => baz
$bar->baz;   # Throws can't find baz error

/ I3az /

...