# 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 と組み合わせると便利になる昨日の紹介をします。