Используя Perl / Moose, что происходит со значением, возвращаемым модификаторами? - PullRequest
2 голосов
/ 14 сентября 2011

Изучение Perl Я только недавно обнаружил чудеса Moose!

Я пытаюсь обернуть голову вокруг модификаторов - или, по крайней мере, как обрабатываются возвращаемые значения ... они хранятся где-то?

{package Util::Printable;

use Moose::Role;

  requires 'to_str','init';

  before 'to_str' => sub {
      my($self) = @_;
      $self->{to_string} = "my string thing";
      return $self->{to_string}; 
  };

  after 'init' => sub{
    my($self) = @_;
    $self->{roles} = __PACKAGE__;
    $self->{is_printable} = 1;
  };


}
1;
__END__ 

Использование роли для печати

{package MonkeyPrint;
use Moose;

with 'Util::Printable';


  sub init{
    my($self) = @_;
    return 1;
  };

  sub BUILD{
    my($self) = @_;
    $self->init();  
  }


  # ------------------------------------------------------------------------ # 
  # Printable Support
  # ------------------------------------------------------------------------ #
  use overload '""' => 'to_str';  

  sub to_str {
      my($self) = @_;
      $self->{to_string} = __PACKAGE__;
      return $self->{to_string}; 
  };


 __PACKAGE__->meta->make_immutable;
}
1;
__END__ 

1 Ответ

6 голосов
/ 14 сентября 2011

Скажем, у метода есть before и after оболочка.

  1. Код before называется.
  2. Возвращаемое значение игнорируется / сбрасывается.
  3. Оригинальный метод называется.
  4. Это значение сохранено.
  5. Код after называется.
  6. Возвращаемое значение игнорируется / сбрасывается.
  7. Возвращенное сохраненное значение возвращается.

Используйте around, если вам нужно изменить или заменить значение, возвращаемое исходным методом.

...