前回のエントリで、catlxom のプラグイン機構を plagger っぽくしてみたのですが、
sub register { my ($class, $c) = @_; $c->catlxom->register_hook( $class, 'setup' => 'setup', 'interpolate' => 'interpolate', ); }
といった感じで、各プラグイン毎にいちいちプラグインを実行する hook ポイントと、その hook ポイントで実行するメソッドを記述するのもちょっと冗長だなぁ、と。
なので、hook ポイント名とメソッド名は同じ、という規約を作ってしまって、Catalxom::Plugins でプラグインロードする際に register_hook してやれば、いちいち register を書く必要がなくなってハッピーだと思ったのでコード書いてみた。
Index: lib/Catlxom/Plugins.pm =================================================================== --- lib/Catlxom/Plugins.pm (revision 23) +++ lib/Catlxom/Plugins.pm (working copy) @@ -51,7 +51,15 @@ ( my $plugin = 'Catlxom::Plugin::' . join( '::', @path ) . $file->basename ) =~ s/\.pm$//; - unshift @Catlxom::Context::ISA, $plugin; + for ( qw(setup initialize start update filter sort paginate fixedup + interpolate end) ){ + if ( $plugin->can($_) ){ + $c->catlxom->register_hook( + $plugin, + $_ => $_, + ); + } + } } if ( $c->debug ) {
これでプラグインのコードがちょっとだけすっきりする。本家からの全差分はこちら。