Как получить ссылку на метод при использовании Moose - PullRequest
2 голосов
/ 02 февраля 2011

Я пытаюсь выяснить, как получить ссылку на код метода с помощью 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 голосов
/ 02 февраля 2011

Вопрос, на который я ссылался выше , подробно описывает различные опции при инкапсуляции вызова метода в коде 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(@_)} могла закрываться поверх него.(@_), добавленное в конец, позволяет передавать аргументы методу.

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

$self->generic_batch_store->(\@buf);

, что просто означает:

($self->generic_batch_store())->(\@buf);
...