とてもステキなペアを発見。Class::DBI::Loaderを使うと、DB上の全てのテーブルをClass::DBIとして定義してくれるわけだが、たいていの場合実際のデータオブジェクトにさらにメソッドを足したりしたい事が多い。
日記才人の場合、例えばPostgreSQLのストアドプロシージャを使う事が多く、それを適時呼んでいる:
package NikkiSite::Data::Diaries;
use strict;
use base qw(NikkiSite::Data::Base);__PACKAGE__->set_sql(latest => <<EOSQL);</pp>
SELECT * FROM nsRetrieveLatestDiaries(?)
EOSQL
まぁ、これを使う所はとりあえず置いておいて、これをClass::DBI::Loaderが定義する情報の上に足したいので、できればこのlib/NikkiSite/Data/Diaries.pmというファイルをrequireしたい。
今まではopendir()とか使ってあまりカッコ良くないことをしていたのだが、ふとModule::Pluggableの事を思いだしたので早速使ってみた。NikkiSite::Data::Loaderという、DBからデータをロードするためのモジュールに
package NikkiSite::Data::Loader;
use strict;
use Class::DBI::Loader::Pg;
use Module::Pluggable
search_path => 'NikkiSite::Data',
except => [ 'NikkiSite::Data::Base', 'NikkiSite::Data::Loader' ],
require => 0,
;
use NikkiSite::Config;BEGIN
{
my $config = NikkiSite::Config->instance;
my $ds = $config->param('DefaultDataSource');my $loader = Class::DBI::Loader::Pg->new(
dsn => $ds->{dsn},
user => $ds->{user},
password => $ds->{password},
options => $ds->{options},
namespace => "NikkiSite::Data",
additional_base_classes => [ qw(NikkiSite::Data::Base) ],
);foreach my $p (__PACKAGE__->plugins) {
eval "CORE::require $p";
warn if $@ && $@ !~ /^Can't locate /;
}
}
きゃー♪これだけで全部requireしてくれちゃう。なんてステキなの。