新しいblogに移行しました

新ブログ "All Yout Bugs Are Belong To Ass" に移行しました!

2008-03-17

[Perl]Class::ComponentのHookの使いどころについて

run_hookを呼べば、Hookアトリビュートのついたメソッドを根こそぎ実行し、それぞれの結果を配列で返すみたいだが、いまいちどういうシーンで使うのか。。。

真っ先に思いついたのは、Plaggerのrunメソッドみたいな感じの使い方。
でも、わざわざ各PluginのメソッドにHookアトリビュートを付けるのは、いかにも面倒な感じがする。

......あ。
podを良く見てみたら、register_hookとかいうメソッドがあるんだね><

で、Waspってpmをでっち上げて、register_hook使ってみた。どうやら、予想通りの使いかたができそうだ。


### lib/Wasp.pm
package Wasp;

use strict;
use 5.8.1;
our $VERSION = '0.01';
use Class::Component;
Class::Component->load_components(qw/Autocall::Autoload/);

1;

### eg/test.pl
use lib qw(../lib ./lib);
use strict;
use warnings;
use Wasp;
use Data::Dumper;

my $c = Wasp->new;

$c->load_plugins(qw/Name Age Area Sex Favorite/);

$c->register_hook(say => { plugin => 'Wasp::Plugin::Name',method => 'say'});
$c->register_hook(say => { plugin => 'Wasp::Plugin::Area',method => 'say'});
$c->register_hook(say => { plugin => 'Wasp::Plugin::Favorite',method => 'say'});
$c->register_hook(say => { plugin => 'Wasp::Plugin::Age',method => 'say'});
$c->register_hook(say => { plugin => 'Wasp::Plugin::Sex',method => 'say'});

print Dumper $c->run_hook(say=>undef);


で、結果。

$VAR1 = [
'Name: YellowTurtle',
'Area: Earth',
'Favorite: Pasta, Olive, Coffee',
'Age: 27',
'Sex: I lovin\' it ;-)'
];


これってWebアプリのウィジェットの配置順序とか、カードゲームのデッキとか、そういう物の表現に向いてそうな感じもする。
だけど、run_hookした先が沢山ある場合、register_hookを何度も呼び出す必要がある。正直、これは結構面倒だ。

例えば、各プラグインの同名メソッドにフックポイントを置きたい場合(上記の例がまさにそう)がある。そんな時には、

$c->register_hook(say => {
plugin => [
'Wasp::Plugin::Area',
'Wasp::Plugin::Name',
'Wasp::Plugin::Favorite',
'Wasp::Plugin::Age',
'Wasp::Plugin::Sex'
],
method => 'say'
});

みたいに書けるとありがたいんだけどなあ。

0 件のコメント: