tokuhirom's Blog

唐突ですがここでプラグインをかいてみよう 〜 軽量フレームワークAmon2入門 (10) 〜

Amon2 のプラグインの書き方がよくわからないという話をたまに聞くので、そのへんについて説明したいとおもいます。

基本的にはプラグインはただの Perl モジュールで、ただ一つの規約にしたがえば問題ありません。それは 'init'という名前のクラスメソッドをもっているということです。ただそれだけです。

package MyPlugin;

sub init {
}

1;

これで、ひとつの valid なプラグインです。

さて、なにもしないプラグインをつくってもしょうがないので、ちょっと機能をたしてみましょう。

package MyPlugin;

sub init {
    my ($class, $context) = @_;
    $context->add_trigger(
        AFTER_DISPATCH => sub {
            my ($self, $res) = @_;
            $res->header('X-Framework' => "Amon2/$Amon2::VERSION");
        }
    );
}

1;

これで立派なプラグインです。AFTER_DISPATCH トリガーをたたくだけの簡単なものです。

あるいはメソッドをはやしたい場合は、以下のようにすればいいでしょう。

package MyApp::Plugin::Web::BrowserDetect;
use HTTP::BrowserDetect;
use Amon2::Util;

sub init {
    my ($class, $c, $conf) = @_;
    Amon2::Util::add_method(
        $c,
        'browser',
        sub {
            $_[0]->{browser} ||= HTTP::BrowserDetect->new(
                $_[0]->req->env->{'HTTP_USER_AGENT'}
            );
        },
    );
}

1;

なお、init の3つ目の引数は、以下のようにわたすことができる hashref です。

__PACKAGE__->load_plugin('+MyApp::Plugin::Web::BrowserDetect', +{configuration => 'Here'});

とまあ、こんなところでしょうか。たんにプラグインは、コンテキストクラスの名前と簡単な設定がはいった hashref がくるので、あとは perl のメタプログラミングをたのしんでくださいね、といった簡単なものとなっています。

なお、プラグインについては、汎用的で実用的なものができたらどんどん CPAN に公開するといいのではないかとおもいます(PrePAN などでレビューをうけてからの方がいいです)。
Catalyst と違ってプラグインあげんな! とかいわないので。