catlxom の プラグイン機構を plagger ライクに #2 (catlxom メモ #7)

前回のエントリで、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 ) {

これでプラグインのコードがちょっとだけすっきりする。本家からの全差分はこちら。