Angelosのプラグイン機構

最終的にPluginはMouseのRoleでhookポイントにmethod modifierでhookして差し込む形にすることにしました。Sledge風なHookとMixin系のPluginを最初完全にわけていたのですが、これで一つに統合できます。

Hookの実現方法

Engine, Controller, Viewごとに、それぞれHookを定義して、そのHookに対して、method modifierでhookする処理内容をかきます。

Controllerの例をみればわかりやすいですね。以下はControllerのActionの処理時間を計測するというPluginになります。

基本はMouseのRoleなのでHook処理も実現できますし、Mixin的にもつかえます。

package Angelos::Controller::Plugin::ActionProfiler;
use Angelos::Plugin;
use Angelos::Logger;
use Time::HiRes qw(time);

has '__action_start_time' => ( is => 'rw', );

has '__action_end_time' => ( is => 'rw', );

before 'ACTION' => sub {
    my ( $self, $c, $action, $params ) = @_; 
    $self->__action_start_time( time() );
};

after 'ACTION' => sub {
    my ( $self, $c, $action, $params ) = @_; 
    $self->__action_end_time( time() );

    my $elapsed = $self->__action_end_time - $self->__action_start_time;
    my $message
        = "action processing time:\naction: $action \ntime  : $elapsed  secs\n";
    Angelos::Logger->instance->log(
        level   => 'info',
        message => $message,
    );  
};

1;

Pluginの組み込みタイミング

各種コンポーネントは、起動時に1回だけ生成されるんですが、そのコンポーネント生成タイミングでこれらのPluginが各種Componentに組み込まれます。

今後

mixinの形式で使う場合に関数名などがバッティングするので、そこはPluginの作り方に規約をもうけようかなと思ってます。

http://github.com/dann/angelos/tree/master