ArkにはModelがあるが、Amon2にはModelが無いという誤解
なんか、タイトルのような誤解があるんだけど完全に間違ってるというか突っ込みどころが多すぎだと思っていたのでそろそろ書く。完全に社内向け。
Ark::Modelsは単なるObject::Containerのラッパーで、シングルトンをバカスカ登録しておけるだけのユーティリティであってModelではありません。Ark本体とModelのグルー的な役割として使われることが想定されているので、Model"s"なのです。シングルトンに賛否はありますが適切に使えば便利は便利です。
社内プロジェクトにおけるディレクトリ構成等も、社内で「お約束」が共有されているから「Modelはここに書く」みたいな"Rail"があるように見えているだけです。別に、ArkにもModelはないし、自分好みに書こうと思えば書けます。元々はtypesterもPath::AttrRouterよろしくArk::Modelsは本体から切り離そうとしてた(らしい)し。
例えば、Amon2でArkで普段使っているようなModelsを定義しようとすると以下のようになります。
package MyApp::Models;
use strict;
use warnings;
use Amon2::Declare;
use Path::Class ();
use Object::Container -base;
register home => sub {
Paht::Class::file(c->base_dir);
};
register conf => sub {
c->config;
};
register Hoge => sub {
...
};
... # シングルトンを登録していく
no Object::Container;
1;
そうすれば、あとは、use MyApp::Models qw/models/
すれば、models
って関数がimportされて、いつもと同じような使い勝手でMyApp::Modelsを使うことができるようになりますね。
なんか、社内の優秀な若い人でも結構Amon2わかりづらいって言っている人が多くて、意外だったりするんだけど、
- コアの部分(Dispatcher)をFlavorで出力するようになってるから、Amon2のコードだけだと途中で処理がぶっつり切れて把握しづらいし、Flavorによってフレームワークの振る舞いがドラスティックに変わる
- Railが無いから逆にどうやって良いかわからない
といったところがあるんだろうなーとか感じます。