Class::DBI::Plugin::TimePiece::MySQL

TokuLogさんかぜぶろさんにインスパイアされますた。

Class::DBIとTime::Pieceを連携(infalteやdefalte)させてみるてすと。

package Class::DBI::Plugin::TimePiece::MySQL;
use Time::Piece::MySQL;
sub import {
    my $class = shift;
    my $pkg   = caller(0);
    unless($pkg->isa('Class::DBI')){
        warn (__PACKAGE__." is for Class::DBI application.");
    }
    no strict 'refs';
    *{"$pkg\::has_a_date"}      = sub { _insert_has_a( 'date', @_ ) };
    *{"$pkg\::has_a_timestamp"} = sub { _insert_has_a( 'timestamp', @_ ) };
    *{"$pkg\::has_a_datetime"}  = sub { _insert_has_a( 'datetime', @_ ) };
}
sub _insert_has_a {
	my $type   = shift;
	my $self  = shift;
	foreach (@_) {
        $self->has_a(
            $_  => 'Time::Piece',
            inflate => "from_mysql_$type",
            deflate => "mysql_$type",
       );
	}
}
1;


んで、DBI側で以下のように呼び出す。

package HapiMate::TableTest;
use base 'HapiMate::DBI';
use Class::DBI::Plugin::TimePiece::MySQL;
__PACKAGE__->set_up_table('table_test');
__PACKAGE__->has_a_datetime('dates');
1;

has_a_datetime以外にも、もちろんhas_a_dateやhas_a_timestampも使える。


そして、こんな感じで使う。

package main;
use HapiMate::TableTest;
my $cd = HapiMate::TableTest->create({ 'id' => 0 });
$cd->dates( time );
$cd->update;

いい感じ