2

学习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__ 
4

1 回答 1

6

假设一个方法有一个before和一个after包装器。

  1. 代码被before调用。
  2. 它的返回值被忽略/丢弃。
  3. 调用原始方法。
  4. 它的价值得以保存。
  5. 代码被after调用。
  6. 它的返回值被忽略/丢弃。
  7. 返回保存的值。

around如果您需要更改或替换原始方法返回的值,请使用。

于 2011-09-13T22:14:38.243 回答