Hatena::Groupcatalyst

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

2008-05-01

MooseのMeta Attributeの仕組みはBread::Boardへのサービスの自動登録に使えそう!

MooseのMeta Attributeの仕組みはBread::Boardへのサービスの自動登録に使えそう! - dann@catalyst を含むブックマーク はてなブックマーク - MooseのMeta Attributeの仕組みはBread::Boardへのサービスの自動登録に使えそう! - dann@catalyst MooseのMeta Attributeの仕組みはBread::Boardへのサービスの自動登録に使えそう! - dann@catalyst のブックマークコメント

Bread::Boardだと、以下のようにdependenciesを書かないといけないですが、この部分を独立したファイルに書くのは、個人的にはあまりよい方法ではないんじゃないかなぁと思います。

             service ’application’ => (
                 class        => ’MyApplication’,
                 dependencies => {
                     logger => depends_on(’logger’),
                     dbh    => depends_on(’Database/dbh’),
                 }
             );

何故、これがよくないかというと、冗長だからです。

Mooseで作るクラスでは、

package MyApplication;
use Moose;
has 'logger' ...

と記述するわけで、loggerに依存しているというのは、そのクラスをみればわかります。知りたいのは実装クラスが何か、要するにloggerを実装したクラスが何か?というのがだけがわかればよいわけです。

ですから、Bread::Boardのように記述するのではなくて、コンテナ側に登録するコードで書くのではなくて、injectされる側のAttributeに何をinjectするのかを明示させたほうがいいだろうなと思っています。

以下のようにして、Serviceの登録部分は自動でするというのが、いいんだろうなぁと思いました。

  • lib/MyApp/Service/* をざっとなめて、serviceクラスをリストアップ
  • dependenciesは、各クラスのhasに書かれたattributeからinjectしたい実装クラスをinject

Attributeの追加とあるAttributeのついたもの取得は、以下のCookbookにある方法でできることがわかりました。via yappo さんblog

http://search.cpan.org/~stevan/Moose/lib/Moose/Cookbook/Recipe21.pod

ということで、上記のことも実現できるじゃん!と思っていたのでした。Mooseかわいいよ、Moose。