#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について説明します