#10 Rowクラスの拡張方法
2011-12-10
Tengでdatabaseからデータを取得すると、基本的には各レコードはTeng::Rowのオブジェクトになって返されます。
my $row = $teng->single('user', +{id => 1});
この時点の$rowはProj::DB::Row::Userというクラスでインスタンス化されています。
しかし今までの説明でProj::DB::Row::Userを定義したことはありませんでした。
Tengではtableに対応するRowクラスを自動的に生成し、利用します。
例えばこのProj::DB::Row::Userというクラスにメソッドを追加したいとします。
その場合は単純に自分でそのクラスを定義するだけです。
package Proj::DB::Row::User; use strict; use warnings; use parent 'Teng::Row'; sub special_method { q{I'm special!} } 1;
それだけで
my $row = $teng->single('user', +{id => 1}); print $row->special_method; # I'm special!
と、独自に定義したメソッドを利用することが可能になります。
Teng::Rowを継承していることにご注意ください。
もし、Proj::DB::Row::Userというnamespaceのクラスでインスタンス化されることが気に入らないとか
ごにょごにょした理由で別のnamespaceにあるクラスを利用したい場合は、
schemaの定義で、row_classを定義することができるので、そうしましょう。
package Proj::DB::Schema; use strict; use warnings; use Teng::Schema::Declare; table { name 'user'; pk 'id'; columns qw/id name/; row_class 'Proj::Api::User'; # ココにRowクラスを指定する }; 1;
こうすることでTengの基本規則から抜けだしたnamespaceでRowクラスを定義し利用することが可能です。
明日は inflate と deflateについて説明します