DBIx::Class::Schema::Loader::Baseを書き換えてDBIx::Class::TimeStampの設定を自動化。

DBIx::Class::TimeStampが便利です。

いつもいつも使います。

そして、いつもいつもSchemaファイルに設定を追加しています。

じゃあ自動化しようと思いました。

DBIx::Class::Schema::Loader::Baseをコピーしたpmファイルを、use libで指定した場所に配置します。
そうするとCPANでインストールしたシステム領域のモジュールよりも、use libで指定したディレクトリのpmファイルを先に探し当てるのでこのファイルを修正します。

DBIx/Class/Schema/Loader/Base.pmの_setup_src_metaを次のように書き換えます。

sub _setup_src_meta {
    my ($self, $table) = @_;

    my $schema       = $self->schema;
    my $schema_class = $self->schema_class;

    my $table_class = $self->classes->{$table};
    my $table_moniker = $self->monikers->{$table};

    $self->_dbic_stmt($table_class,'table',$table);

    my $cols = $self->_table_columns($table);
    my $col_info;
    eval { $col_info = $self->_columns_info_for($table) };

    ### add
    if ( $col_info->{created_on} ) {
         my %col = %{ $col_info->{created_on} };
         $col_info->{created_on} = { %col, set_on_create => 1 };
    }

    ### add
    if ( $col_info->{modified_on} ) {
         my %col = %{ $col_info->{modified_on} };
         $col_info->{modified_on} = { %col, set_on_create => 1, set_on_update => 1 };
    }

    if($@) {
        $self->_dbic_stmt($table_class,'add_columns',@$cols);
    }
    else {
        my %col_info_lc = map { lc($_), $col_info->{$_} } keys %$col_info;
        $self->_dbic_stmt(
            $table_class,
            'add_columns',
            map { $_, ($col_info_lc{$_}||{}) } @$cols
        );

    }

    my $pks = $self->_table_pk_info($table) || [];
    @$pks ? $self->_dbic_stmt($table_class,'set_primary_key',@$pks)
          : carp("$table has no primary key");

    my $uniqs = $self->_table_uniq_info($table) || [];
    $self->_dbic_stmt($table_class,'add_unique_constraint',@$_) for (@$uniqs);

    $schema_class->register_class($table_moniker, $table_class);
    $schema->register_class($table_moniker, $table_class) if $schema ne $schema_class;
}

DBから取得したカラム情報をメモリに保存してからファイルに書き出しているので、そのファイルに書き出す前に
取得したカラム情報をちょっと加工しているだけです。

欠点: カラム名が限定されている。

もっといい方法がある気がしていますが、そのうち誰かが教えてくれるでしょう…