Как получить ссылку на метод при использовании Moose
Я пытаюсь понять, как получить ссылку на код метода с помощью Moose.
Ниже приведен пример того, что я пытаюсь сделать:
use Modern::Perl;
package Storage;
use Moose;
sub batch_store {
my ($self, $data) = @_;
... store $data ...
}
package Parser;
use Moose;
has 'generic_batch_store' => ( isa => 'CodeRef' );
sub parse {
my $self = shift;
my @buf;
... incredibly complex parsing code ...
$self->generic_batch_store(@buf);
}
package main;
$s = Storage->new;
$p = Parser->new;
$p->generic_batch_store(&{$s->batch_store});
$p->parse;
exit;
1 ответ:
Вопрос, на который я ссылался выше , подробно описывает различные варианты инкапсуляции вызова метода в коде ref. В вашем случае я бы написал пакет
main
следующим образом:my $storage = Storage->new; my $parser = Parser->new; $parser->generic_batch_store(sub {$storage->batch_store(@_)}); $parser->parse;
$storage
изменяется на лексический, так что ссылка кодаsub {$storage->batch_store(@_)}
может закрываться над ним.(@_)
, добавленный в конец, позволяет передавать аргументы в метод.Я не эксперт по лосям, но я считаю, что вам нужно будет вызвать код с дополнительной стрелкой разыменования:
$self->generic_batch_store->(\@buf);
Что просто сокращенно означает:
($self->generic_batch_store())->(\@buf);