SlideShare a Scribd company logo
Catalyst::Model::Adaptor Hideo Kimura (hide-k)
Catalyst のいやんなところ component が context に依存してるー>特に Model! MyApp::M::Foo にビジネスロジックを実装すると Catalyst でしか使えない Test が面倒くさい!
そこで C::M::Adaptor 既存クラスを C::Model にしてくれる アダプタークラス 必要なのは Model にしたいクラス 超簡単!
作り方 Helper がついてる script/myapp_create model Foo Adaptor Foo::Class create package MyApp::Model::Foo; use strict; use warnings; use base 'Catalyst::Model::Adaptor'; __PACKAGE__->config( class  => ‘Foo::Class', constructor => ‘create', ); 1;
呼び出し方 sub bar : Local {  my ($self, $c) = @_;  $c->model(‘Foo')->bar; }  普通の Model みたいに使える
コンストラクタ引数の渡し方 config で渡せる myapp.yml Model::Foo:  args:  foo: ...  bar: ... 普通の Model と一緒
コンストラクタ引数の注意 デフォルトではコンストラクタの引数に HashRef しか渡せない $class->new(foo => ‘aaa’, bar => ‘bbb’); sub mangle_arguments { my ($self, $args) = @_; return %$args;  }  ちょっとだけおまじないが必要
Adaptor, Factory, Factory::PerRequest C::M::Adaptor アプリケーション起動時にクラスをインスタンス化 C::M::Factory $c->model(‘Foo’) の呼び出しの度にインスタンス化 C::M::Factory::PerRequest Factory と同じだけど、 1 リクエストで最初の呼び出しの時だけインスタンス化
Net::Twitter を Model 化
他にも DBIC を使ったビジネスロジッククラスを Model 化して単体テストを可能に TheSchwartz を Model 化してキューの監視ツールを Catalyst で作ってみる アイデアはキミしだい!
C::Model::Adaptor を使うと 既存クラスを簡単に Model にできるよ context から設定も簡単に渡せるよ クラスはアプリケーション起動時にインスタンス化されるよ ビジネスモデルを C::Model から追い出せるよ Catalyst に依存しない Test ができるよ Catalyst は Dispatcher と Engine だけ やってればいいよ(サンフランシスコ在住 男性) ちょっと小粋ないいやつです
ご静聴ありがとうございました m(_ _)m

More Related Content

Catalyst::Model::Adaptor