Как получить ссылку на метод при использовании 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 2

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);