Catalyst-Model-DynamicAdaptor-0.01 をUPしました。

Catalyst-Model-DynamicAdaptorcpanにあげました。

何ができるの?

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 などの命名提案をして頂きましたが、数時間悩んだ末、今回は見送らさせてもらいました。