Как я могу получить доступ к методу класса потребителя внутри метода, созданного во время выполнения в методе параметризованной роли с использованием Moose с Perl? - PullRequest
0 голосов
/ 10 марта 2010

Я определяю метод внутри параметризованной роли, который должен создать новый класс во время выполнения, используя Moose::Meta::Class->create и применяю эту точно параметризованную роль к нему.Я также создаю новый метод для этой роли, используя

$new_class->meta->add_method( some_name => sub {
 my ($self) = @_;
 ...
})

внутри подпрограммы {...} Я хочу получить доступ к методу класса потребителя и использовать его для чего-то, я пытался использовать $self->get_method, это не сработало, как мне это сделать?

Обратите внимание, что $self внутри подпрограммы выше MooseX::Role::Parameterized::Meta::Role::Parameterizable

У меня также есть другой вопрос, если я делаюэто:

my $object = Moose::Meta::Class->create(
       "some_type",

);

Почему $object не имеет типа some_type, а какой-то некрасиво MooseX::Role::Parameterized::Meta::Role::Parameterizable и как мне добраться до объекта типа some_type?

Ответы [ 3 ]

1 голос
/ 10 марта 2010

Чтобы ответить на ваш второй вопрос, причина в том, что OO в Perl не позволяет вам добавлять метод только к одному экземпляру класса, поэтому Moose должен подделать его, создав подкласс с дополнительным методом и выполнив повторную проверку уникальности. объект в этом подклассе.

Обратите внимание, что если вы все делаете правильно и делаете самоанализ с помощью isa, has и / или does, а не пытаетесь полагаться на имя благословенного пакета объекта, это не иметь значение. Объект по-прежнему isa some_type, has все атрибуты some_type и does все роли some_type, даже несмотря на то, что теперь он помещен в пакет с некрасивым автоматически сгенерированным именем.

0 голосов
/ 24 марта 2010

Я не совсем уверен, что вы пытаетесь сделать здесь. Давайте предположим, что у вас есть

my $new_class = Moose::Meta::Class->create('FooBar');

затем $new_class - это мета-объект для FooBar. Итак, если вы хотите добавить метод к FooBar, вы скажете

$new_class->add_method(foo => sub { … });

, который в основном совпадает с

FooBar->meta->add_method(foo => sub { … });

Вы также, вероятно, должны использовать find_meta() из Moose :: Util . Это вернет правильный мета-объект (если он есть), даже если у вашего класса нет метода meta или он использует его для чего-то другого.

Как я уже сказал, я не уверен, что это отвечает на ваш вопрос.

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

Похоже, что ваша основная проблема - почти то же, что я описал на этом вопросе : из определения роли вы должны получить класс (и его мета-класс) объекта или класса роль применяется к. Это невозможно из обычных ролей, но возможно через параметризованные роли.

...