=encoding utf8
=pod
=head1 題名
Moose::Cookbook::Basics::Recipe6 - augment/innerの例
=head1 概要
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;
=head1 本文
このレシピではCメソッドモディファイアの動作を紹介します。このモディファイアは通常のサブクラスから親クラスへというメソッド解決順序を逆転させるものです。Cを使うと、「もっとも具体的でない(抽象的な)」メソッドがまず呼ばれ、Cを呼ぶたびに継承ツリーをたどって、もっとも具体的なサブクラスで終わります。
Cモディファイアを使って設計した親クラスは、具体的に拡張していくことができます(親クラスでは一般的なラッパ機能を用意し、サブクラスを使って詳細を詰めていきます)。
上の例では、ドキュメントクラスを一組作りました。もっとも具体的なものはCです。
まずはもっとも具体的でないCから見ていきましょう。CのCメソッドにはCの呼び出しがあります。
sub create {
my $self = shift;
$self->open_page;
inner();
$self->close_page;
}
このCはCがエクスポートしている関数で、Cされたメソッドで使えるCのようなものです。Cが呼ばれると、Mooseはチェーンの中から次のメソッドを探します(この場合はCのCモディファイア)。お気づきの通り、Cはモディファイアの中でも呼べます。
augment 'create' => sub {
my $self = shift;
$self->create_header;
inner();
$self->create_footer;
};
すると、次の、もっとも具体的なモディファイアが見つかります(Cクラスのものです)。
最後、Cクラスでチェーンは終わりです。
augment 'create' => sub {
my $self = shift;
$self->create_tps_report;
inner();
};
もう一度C関数を呼んでいますが、これ以上具体的なサブクラスはありませんので、ここでは何もしません。この呼び出しを入れておくと、将来Cを簡単にサブクラス化できるようになります。
=head1 まとめ
Cモディファイアは、ネストしたラッパを作成できる強力なツールです。始終必要になるものではありませんが、必要なときには非常に役に立ちます。
=head1 作者
Stevan Little Estevan@iinteractive.comE
Dave Rolsky Eautarch@urth.orgE
=head1 COPYRIGHT AND LICENSE
Copyright 2007-2009 by Infinity Interactive, Inc.
L
This library is free software; you can redistribute it and/or modify
it under the same terms as Perl itself.
=cut