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;