MoFedge::Data::DBIC::Schemaの一部を公開してみるの術
Makiさんが、
http://d.hatena.ne.jp/lestrrat/20060811#1155274519
こういうHackをしていたので、書かずには居られなくなった。
一部切抜きでご紹介。
(DataTimeにインフレートしてるところだけをご紹介)
これがMoFedge::Data::DBIC::Schemaだ!!
package MoFedge::Data::DBIC::Schema;
use strict;
use warnings;
use base qw/MoFedge DBIx::Class::Schema/;use DateTime::Format::MySQL;
use MF::DateTime;sub register_column {
my ($self, $col) = @_;
$self->next::method($col);$self->date_column($col) if $col =~ /_on$/;
$self->datetime_column($col) if $col =~ /_at$/;
$self->datetime_column($col) if $col =~ /^created_on$/;
$self->datetime_column($col) if $col =~ /^updated_on$/;
}sub datetime_column {
my $class = shift;
my $col = shift;$class->inflate_column($col, {
inflate => sub {
my $dt = DateTime::Format::MySQL->parse_datetime(shift);
return $dt ? MF::DateTime->from_object(object => $dt) : undef;
},
deflate => sub {DateTime::Format::MySQL->format_datetime(shift)},
});
}sub date_column {
my $class = shift;
my $col = shift;$class->inflate_column($col, {
inflate => sub {
my $dt = DateTime::Format::MySQL->parse_date(shift);
return $dt ? MF::DateTime->from_object(object => $dt) : undef;
},
deflate => sub {DateTime::Format::MySQL->format_date(shift)},
});
}1;
まだMoFedge::Data::DBIC::Schemaはソースが汚いのと、
もっと色々と機能を実装したいので全部は公開できませぬが。。。
ほかにもオートでbelogns_toさせたり、
created_onやupdated_onを自動でデータ挿入したり
とかあります。
どーでしょーか。
(追記)
ちなみに使い方はこれだけ。
かってにインフレートしてくれます。
package Proj::Schema;
use strict;
use warnings;
use base 'MoFedge::Data::DBIC::Schema';__PACKAGE__->load_classes( );
1;
package Proj::Schema::Contents;
use strict;
use warnings;
use base 'Proj::Schema';__PACKAGE__->table('contents');
__PACKAGE__->add_columns(qw/
id
rid
user_id
title
body
created_on
timestamp
/);
__PACKAGE__->set_primary_key('id');1;