2013-07-06
Teng::Plugin::RowObjectEnableSwitcher あらため Teng::Plugin::RowObjectCreationSwitcher ってのを書いてみた
追記 2013/10/19
@songmu さんにいくつかアドバイスもらったり、色々しつつ、名称などを直して CPAN にも上げました。
あと紹介記事も書いてもらった。
もともとの記事(名称などの表記を一部直しています)
某チャットで、「guard で Row オブジェクト作るかどうか切り替える物体を昔作ったよ!」って話をしたら、 なかなか好評だったので、Teng のプラグインとして書いてみた。(書いたのは結構前なのだけど、記事を書きそびれてました…)
Synopsis まるコピーですが、大体こんな感じで使えます。
use MyProj::DB;
use parent qw(Teng);
__PACKAGE__->load_plugin('RowObjectCreationSwitcher');
package main;
my $db = MyProj::DB->new(dbh => $dbh);
{
my $guard = $db->temporary_suppress_row_objects_guard(1); # Row オブジェクトが作られなくなる(suppress_row_object=1)
{
my $guard2 = $db->temporary_suppress_row_objects_guard(0); # Row オブジェクトが作られるようになる。(suppress_row_object=0)
... # Teng をつかってあんなことやこんな事をする
}
# $guard2 が無くなる(Row オブジェクトの作成が再度無効に suppress_row_object=1)
... # do something
}
# $guard がなくなる(Row オブジェクトが作成されるようになる suppress_row_object=0)
この例だとメリットあんま分からないかもですが、メソッド/関数なんかもスコープ持ってて guard が効くので、「メソッド内だけ Row オブジェクトを有効/無効」とかがカジュアルに出来て便利だと思います。
これはもともと僕が作ってる(た?) Kappa という ORM が持ってた機能で、それを Plugin として Teng に持ってきた、という感じです。テストコードは Teng と Kappa の悪魔合体や!
メソッド名は最初は Kappa 側にあわせてたのですが、色々あって最終的に Teng 側にあわせるようにしました。
一番の問題は、僕が Teng 最近さわって無いので、ちゃんと動いてるか、ちゃんと確認する手段がないってことですね。。。
興味があれば、使っていただけるとうれしいです。