Catalyst でのモデルとロジック

分けたほうがいいよー!という話を最近よく聞く(読む)ので、分けるようにした。
とりあえず Catalyst での config やら model はそのまま使いたいけれど、CLI とかではどうするの?って話になるので、その辺もくそかっこわるいけどなんとかできるように。

具体的には、Catalyst::Model::DynamicAdaptor をほんのちょっと拡張して、Catalyst::Model::DynamicAdaptor::Lazy というものを作った。
実際に使う場合には、それをベースクラスに持つ MyApp::Model::Logic なんてのをこさえて、MyApp::Logic::Hoge やら MyApp::Logic::Fuga なんてものを坦々と作ると。
で、Catalyst で動作している場合は、DynamicAdaptor そのまんまに $c->model('Logic::Hoge') 出来るし、Catalyst じゃない場合は、MyApp::Model::Logic のカスタムコンストラクタに config と schema を渡せばいいと。具体的にはこんな感じに使えるように。

my $config = LoadFile(file($Bin, '..', 'myapp.yml')); # とりあえず YAML 使ってるので
my $schema = MyApp::Model::DBIC->new;
my $l      = MyApp::Model::Logic->new_with_nocatalyst('MyApp::Logic', $config, $schema);
print $l->logic('Hoge')->say;

安直で、素晴らしくかっこわるい。正直このまま実用する気はない。