catalyst::model::adaptor

12

Click here to load reader

Upload: hideo-kimura

Post on 05-Jul-2015

3.887 views

Category:

Technology


0 download

DESCRIPTION

CatCon#1

TRANSCRIPT

Page 1: Catalyst::Model::Adaptor

Catalyst::Model::Adaptor

Hideo Kimura (hide-k)

Page 2: Catalyst::Model::Adaptor

Catalyst のいやんなところ

• component が context に依存してるー>特にModel!

• MyApp::M::Foo にビジネスロジックを実装すると Catalyst でしか使えない

• Test が面倒くさい!

Page 3: Catalyst::Model::Adaptor

そこで C::M::Adaptor

• 既存クラスを C::Model にしてくれるアダプタークラス

• 必要なのは– Model にしたいクラス

• 超簡単!

Page 4: Catalyst::Model::Adaptor

作り方

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;

Page 5: Catalyst::Model::Adaptor

呼び出し方

sub bar : Local { my ($self, $c) = @_; $c->model(‘Foo')->bar;}

普通の Model みたいに使える

Page 6: Catalyst::Model::Adaptor

コンストラクタ引数の渡し方

config で渡せる

myapp.yml

Model::Foo: args: foo: ... bar: ...

普通の Model と一緒

Page 7: Catalyst::Model::Adaptor

コンストラクタ引数の注意

デフォルトではコンストラクタの引数に HashRef しか渡せない

$class->new(foo => ‘aaa’, bar => ‘bbb’);

sub mangle_arguments { my ($self, $args) = @_; return %$args; }

ちょっとだけおまじないが必要

Page 8: Catalyst::Model::Adaptor

Adaptor, Factory, Factory::PerRequest

• C::M::Adaptor– アプリケーション起動時にクラスをインスタンス化

• C::M::Factory– $c->model(‘Foo’)の呼び出しの度にインスタンス化

• C::M::Factory::PerRequest– Factoryと同じだけど、 1 リクエストで最初の呼び出しの時だけインスタンス化

Page 9: Catalyst::Model::Adaptor

Net::Twitter を Model 化

Page 10: Catalyst::Model::Adaptor

他にも

• DBIC を使ったビジネスロジッククラスをModel 化して単体テストを可能に

• TheSchwartz を Model 化してキューの監視ツールを Catalyst で作ってみる

• アイデアはキミしだい!

Page 11: Catalyst::Model::Adaptor

C::Model::Adaptor を使うと

• 既存クラスを簡単に Modelにできるよ

• context から設定も簡単に渡せるよ

• クラスはアプリケーション起動時にインスタンス化されるよ

• ビジネスモデルを C::Modelから追い出せるよ

• Catalystに依存しない Testができるよ

• Catalystは Dispatcherと Engine だけやってればいいよ(サンフランシスコ在住 男性)

• ちょっと小粋ないいやつです

Page 12: Catalyst::Model::Adaptor

ご静聴ありがとうございましたm(_ _)m