Hatena::Groupcatalyst

dann@catalyst このページをアンテナに追加 RSSフィード

2008-05-01

AOPのadviceをMoose+Bread::Boardで

AOPのadviceをMoose+Bread::Boardで - dann@catalyst を含むブックマーク はてなブックマーク - AOPのadviceをMoose+Bread::Boardで - dann@catalyst AOPのadviceをMoose+Bread::Boardで - dann@catalyst のブックマークコメント

Mooseのmethod_modifireは、いわゆるAOPのadviceと同じで、before, after, arroundのadivceに対応するmethod_modifireが存在します。

Mooseの実装をみると、metaのmethod_modifireに登録してるだけなので(実際はMooseというよりも、Class::MOP使ってるだけ)、Mooseでクラスにaroundを直にかくっていう方法だけでなくて、もっと汎用的に使えそうです。

        around => sub {
            my $class = $CALLER;
            return subname 'Moose::around' => sub (@&) {
                my $code = pop @_;
                my $meta = $class->meta;
                $meta->add_around_method_modifier( $_, $code ) for @_;
            };
        },

Mooseを使って、aroundのkeywordを使って、直にクラスにarroundなどの定義をかいてしまうと、使える場所が限られてしまうのですが、これをRoleやクラスの実装から切り離すと、AOPと同じように、クラスの横断的な関心毎をクラスから切り離して扱うことが出来そうです。

実際には、以下のような感じでBread::Boardを拡張すれば使えそうです。

クラスをBread::Boardのサービスとして登録する際に、そのクラスのMethodのAttributeをみて、そのAttriubteがTransaction Attributeだったら、around method modifireとして、Transactionの開始終了を埋め込んだ実装を登録する

とすればよさそうです。

Mooseを使うと、Bread::BoardをベースにしたDIコンテナの仕組みも、より便利に使えそうですね。