Catalyst-Model-DynamicAdaptor-0.01 をUPしました。
Catalyst-Model-DynamicAdaptorをcpanにあげました。
何ができるの?
Catalyst::Model::DBIC::Schemaみたいに、モジュールを動的に読み込むことができます。
ケーススタディ
MyApp::Logic 配下のモジュールを動的に読み込みたいとしましょう。
まず読み込むモジュールを作る
読み込みたいモジュールの唯一のルールは、new() が必要です。このnew は Modelのnewの時に実行されます。
また、共通の引数を取得することができます。
package MyApp::Logic::Foo; use strict; use warnings; sub new { my $class = shift; my $self = shift || {} ; bless $self, $class; return $self; } sub foo { my $self = shift; return $self->{who} ." is foo"; } 1; package MyApp::Logic::Oppai; sub new { my $class = shift; my $self = shift || {} ; bless $self, $class; return $self; } sub oppai { my $self = shift; return $self->{who} ." loves Oppai"; } 1;
Modelを作ろう
これは、簡単です。Catalyst::Model::DynamicAdaptorを継承するだけです。
また、class に読み込むディレクトリの、上の階層を指定します。
configを設定することにより、Logic::Foo->new( { who => 'vkgtaro'}) のように、引数を与えることができます。
package MyApp::Model::Logic; use strict; use warnings; use base qw/Catalyst::Model::DynamicAdaptor/; __PACKAGE__->config({ class => 'MyApp::Logic', config => { who => 'vkgtaro' }, }); 1;
使ってみよう
こんな感じでつかえます。
package TestApp::Controller::Root; use strict; use warnings; use base 'Catalyst::Controller'; __PACKAGE__->config->{namespace} = ''; sub default : Private { my ( $self, $c ) = @_; $c->log->info( $c->model('Logic::Foo')->foo ); $c->log->info( $c->model('Logic::Oppai')->oppai ); } 1;
以上です
どうでしょうか。
動的モジュール内で、catalystがもっているデータを使いたい場合は、
そのデータをシングルトン化して使用すればいいのではないかと思います。
ご清聴ありがとうございました。
追記
命名は、id:ikasam_a氏にしていただきました。
ちなみに、id:dann氏から、Catalyst::Funky::VaginaLoader FunkyLoader LazyLoader
id:woremacx氏から、 VaginaLoader などの命名提案をして頂きましたが、数時間悩んだ末、今回は見送らさせてもらいました。