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