使用Perl / Moose,修饰符返回的值会发生什么变化?

时间:2011-09-13 21:08:36

标签: perl return-value moose modifier

学习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 个答案:

答案 0 :(得分:6)

假设某个方法包含beforeafter包装。

  1. 调用before代码。
  2. 忽略/丢弃其返回值。
  3. 调用原始方法。
  4. 它的值已保存。
  5. 调用after代码。
  6. 忽略/丢弃其返回值。
  7. 返回保存的值。
  8. 如果您需要更改或替换原始方法返回的值,请使用around