Blog

Amon2 に local context mode をつけた

問題

Amon2 のプロジェクトを2つ Plack::Builder で mount してつかいたい、みたいなときにコンテキストがどっちかこんがらがったりしそうかなーっておもったりしたんで。
というかなんかこう、サブアプリみたいなやつをつくりたいとき用です。
TheSchwartz Monitor を Amon2 でつくって mount する、的な。

解決方法

Amon2 3.72 で用意された make_local_context メソッドをつかえばいい。以下のように簡単にちいさなアプリをつくれる。

package MyApp;
use parent qw(Amon2 Amon2::Web);
use Amon2::Web::Dispatcher::Lite;

__PACKAGE__->make_local_context();

use Text::Xslate;
use File::Spec;
sub create_view {
  Text::Xslate->new(
    syntax => ['TTerse'],
    module => [
      'Text::Xslate::Bridge::Star',
    ],
    path => [File::Spec->catfile(__PACKAGE__->base_dir, 'tmpl')],
  );
}

get '/' => sub {
  my $c = shift;
  $c->render('index.tt');
};

1;

make_local_context をつかうと、$Amon2::CONTEXT のかわりに $MyApp::CONTEXT をつかうようになる。ただし、Amon2::Declare や Amon2->context に依存したプラグインなどはうごかないので注意が必要。
基本、ちいさなツールをうめこむとき専用で、普段づかいすることは想定されていない。