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