# inflate setup
    use Data::Model::Schema::Inflate;
    use DateTime;

    inflate_type DateTime => {
        inflate => sub {
            DateTime->from_epoch( epoch => $_[0] );
        },
        deflate => sub {
            ref($_[0]) && $_[0]->isa('DateTime') ? $_[0]->epoch : $_[0];
        },
    };

inflate_type の第一引数に定義名を書き、第二引数に inflate, defulate を key にして value に CODE リファレンスを書いた HASH リファレンスを渡します。

HASH-ref の中身の inflate と deflate の中身は全く変わっていません。

これを、利用するには column の定義の中の inflate に対して定義名を渡すだけです。

    column create_at => int => {
        required => 1,
        unsigned => 1,
        default => sub { time() },
        inflate => 'DateTime',
    };

ちょっと簡潔になりましたね。

ちなみに、組み込みの inflate 定義として URI と Hex があります。

定義は以下のように成っています。

# in Data::Model::Schema::Inflate
my %INFLATE = (
    inflate => {
        URI  => sub { URI->new($_[0]) },
        Hex  => sub { unpack("H*", $_[0]) },
    },
    deflate => {
        URI  => sub { $_[0]->as_string },
        Hex  => sub { pack("H*", $_[0]) },
    },
);

使ってみる

利用方法は昨日のコピペですが以下のようになります。

以下のように使います。

    $bookmark->set( bookmark => [1, 1] );
    my $row = $bookmark->lookup( bookmark => [1, 1] );
    print $row->create_at . "\n";

    my $dt = DateTime->new( year => 1978, month => 3, day => 20 );
    $row->create_at( $dt );
    print $row->create_at . "\n";
    $row->update;

    my $row2 = $bookmark->lookup( bookmark => [1, 1] );
    print $row2->create_at . "\n";
    $row2->create_at( 0 );
    print $row2->create_at . "\n";
    $row2->update;

    my $row3 = $bookmark->lookup( bookmark => [1, 1] );
    print $row3->create_at . "\n";

結果は下記の通り。

(この行は実行した時間が入ります)
1978-03-20T00:00:00
1978-03-20T00:00:00
0
1970-01-01T00:00:00

まとめ

本日は再利用可能な Inflate に関して説明しました。

明日は Inflate と組み合わせると便利になる昨日の紹介をします。

Mon, 14 Dec 2009 05:51:02 GMT  |  Index

Main Tracks

Yet Anthor Tracks

Other Sites

Powered by nim