Class::DBI::Loader + Module::Pluggable

| コメント(0) | トラックバック(0)



とてもステキなペアを発見。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してくれちゃう。なんてステキなの。


Author

Daisuke Maki (a.k.a lestrrat): Perl hacker, Director of Japan Perl Association, YAPC::Asia Tokyo Organizer (2009-2012), Fluent in Japanese, English. Ex-Brazilian (sorta)

#perl #c #ruby #java #mysql #english #japanese #opensource #stf #cooking #scotch #cigar


このエントリーをはてなブックマ
ークに追加

翔泳社よりモダンPerl入門(2010)を出版させていただいております。できれば内容をアップデートしたいので是非皆様・・・現在の在庫処理にお力をお貸しください!><

月別アーカイブ