取势 明道 优术

作者为 扶 凯 发表

概要

  package Document::Page;
  use Moose;

  has 'body' => ( is => 'rw', isa => 'Str', default => sub {''} );

  sub create {
      my $self = shift;
      $self->open_page;
      inner();
      $self->close_page;
  }

  sub append_body {
      my ( $self, $appendage ) = @_;
      $self->body( $self->body . $appendage );
  }

  sub open_page  { (shift)->append_body('') }   sub close_page { (shift)->append_body('') }

  package Document::PageWithHeadersAndFooters;
  use Moose;

  extends 'Document::Page';

  augment 'create' => sub {
      my $self = shift;
      $self->create_header;
      inner();
      $self->create_footer;
  };

  sub create_header { (shift)->append_body('
') } sub create_footer { (shift)->append_body('
') } package TPSReport; use Moose; extends 'Document::PageWithHeadersAndFooters'; augment 'create' => sub { my $self = shift; $self->create_tps_report; inner(); }; sub create_tps_report { (shift)->append_body(''); } #
my $report_xml = TPSReport->new->create;

描述

这个指南演示怎么样使用 augment 的方法修饰是怎么样工作的,这个方法修饰反转了标准的子类到父这种方法解析顺序,使用 augment 方法修饰会让内部具体的方法被首先调用.并按照继承树来调用,直到指定的特定的子类结束.
这个 augment 方法修饰让你设计一个父类,能以特定的方式进行扩展.这个父类提供了一个通用的对功能函数进行包装功能,给子类的细节放到这个功能中.
在上面的例子,我们创建了一个 document 类的设置,和一个最具体的 TPSReport 类.

我们开始这个最外层的 Document::Page 类.这个 create 的方法调用了一个 inner();

sub create {
      my $self = shift;
      $self->open_page;
      inner();
      $self->close_page;
}

 

这个 inner() 功能是在 Moose 中导出来的, 它对于 augment 方法很象 super, 当 inner() 被调用时 Moose 会找下一个链中的方法,这个方法是下一个子类 Document::PageWithHeadersAndFooters 中的 augment 的方法,你将注意到,还能在自己的方法修饰中接着调用 inner .

augment 'create' => sub {
      my $self = shift;
      $self->create_header;
      inner();
      $self->create_footer;
};

我们能发现下个在 TPSReport 类中最深的 augment 方法修饰.
最终,在 TPSReport 类,这个调用链结束了

augment 'create' => sub {
      my $self = shift;
      $self->create_tps_report;
      inner();
};

我能在很多的时候调用 inner 的功能.但是,只要没有使用 augment 定义更深层的子类,这就不会有操作,在进行这个功能,意味着我们未来可以很容易地使用子类 TPSReport .

结论

这个 augment 的方法修饰是创建类的嵌套包装的强大的工具,虽然这不是你会经常需要的东西,但当你使用时,它会非常的方便.是不是发现人生又美好一些了.

 

来了就留个评论吧! 1个评论