今回のテーマ
最終回の今回は,
サンプルアプリケーション
本連載では,
svn co -r 1641 http://svn.coderepos.org/share/lang/perl/Gopper/trunk Gopper
Hook処理とは?
モジュール本体のコードを書き換えることなく,
直感的に理解できるように,
Class::Trigger
Hook処理を実装する事が出来る代表的なCPANモジュールといえばClass::Triggerでしょう。
Class::TriggerはSledgeを拡張するために使われている事で有名です。
Class::Triggerは,
下記のようなモジュールをあらかじめ用意しておき
# Hello.pm
package Hello;
use strict;
use warnings;
use Class::Trigger;
sub say {
__PACKAGE__->call_trigger('say');
}
1;
# hello.pl
use strict;
use warnings;
use Hello;
Hello->add_trigger( say => sub { print 'こんにちわ!' } );
Hello->say;
add_
add_
# hello.pl
use strict;
use warnings;
use Hello;
Hello->add_trigger( say => sub { print 'こんにちわ!' } );
Hello->add_trigger( say => sub { print 'こんにちわ!' } );
Hello->say;
モジュール書くけど,
既存の複雑なプログラムをClass::Triggerを使ってプラガブルにする。という内容でClass::Trigger作者のmiyagawaさんが今年のYAPC::Asia 2007 Tokyoにて発表しており,
Plagger
筆者がClass::Componentを作る動機となったのは,
PlaggerもClass::Triggerの作者と同じ人が作っているだけあって,
表1 Plaggerで実装されているHook関連のメソッド
メソッド名 | 役割 |
---|---|
register_ | hook pointを登録します |
run_ | 指定したhook pointを実行します |
run_ | 指定したhook pointを実行し, |
Hook関連のメソッドは少なく,
register_
Class::Triggerで言う所のadd_
実際のプラグインのコードを引用すると下記のように利用されます。
# Plagger::Plugin::Publish::CHTML
sub register {
my($self, $context) = @_;
$context->register_hook(
$self,
'publish.feed' => \&feed,
'publish.finalize' => \&finalize,
);
$self->chtml_init($context);
}
run_
# in Plagger->do_run_with_feedsB
$self->run_hook('publish.finalize');
もし先ほどの Publish::CHTML プラグインを使っている場合には,