真っ先に思いついたのは、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 件のコメント:
コメントを投稿