トップ «前の日記(■2011-01-24) 最新 次の日記(■2011-02-01)» 編集

どんぞこ日誌

2003|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|07|08|12|
2007|01|04|08|12|
2008|01|02|03|04|06|07|08|10|11|12|
2009|01|02|04|05|06|07|08|09|11|12|
2010|01|03|04|07|08|10|11|12|
2011|01|02|03|04|05|06|07|08|10|12|
2012|01|02|03|05|06|07|08|09|10|
2013|01|02|07|08|09|
2014|08|09|
2015|08|
2016|06|07|12|
2017|01|03|08|
2018|03|
2022|03|
2023|03|
2024|02|07|10|

同人関連(どんぞこ楽屋) | 旧い雑文   


■2011-01-30

* [Perl][Acme] Tengの素敵モジュールつくったB!

 nekokakさんの新しいORM、Teng天狗 - (small|simple) DBI wrapper / ORM)を色々さわってみました。ちょうど去年の春にDBIx::SkinnyをDBICっぽくなどと、ろくでもないことをやっていましたので、今回もゴソゴソとちょっとしたモジュールを作ってみました。Acme::TengA::SchemaOnAHoleというものです。名前について説明すると、TengAのAはAdvancedのAですね。CatalystXやMooseXのようなものです。Holeというのは、Schemaモジュールに穴あけて弄くろうという心意気を表しているのですが、色々あって穴の上のSchemaになってしまいました。お察しください。簡単な使い方としては:

 package MyModel::Schema;
 
 use Teng::Schema::Declare;
 use TengA::SchemaOnAHole (
    'foo' => sub  {
         my ( $schema, $table, @args ) = @_;
         # $schema ... Teng::Schema オブジェクト
         # $table  ... 属するtableのTeng::Schema::Tableオブジェクト
     }
 );
 
 table_in_private_room {
     name    'table';
     pk      @pks;
     columns @columns;
     foo @args;
 };

という感じでSchemaオブジェクトをいじることができる関数を導入します。ただしtable_in_private_roomでしか使えないのでご注意を。普通のtableで使うとcroakします。また、プラグイン的なものをつくるには下記のようになります。

 package TengA::Schema::Declare::FooBar;
 
 use strict;
 require TengA::SchemaOnAHole;
 
 sub import {
     my ( $class, @args ) = @_;
     TengA::SchemaOnAHole->import(
         { import_level => 1 },
         'bar' => sub  {
             my ( $schema, $table, @args ) = @_;
             # ...
         },
     );
 }
 
 # あとはuseするだけ
 package MyModel::Schema;
 
 use Teng::Schema::Declare;
 use TengA::Schema::Declare::FooBar;
 
 table_in_private_room {
     name 'table1';
     pk 'col1';
     columns qw( col1 col2 col3 );
     bar 'foo', 'bar';
 };

 Schema操作のためのAPIが用意され、弄らないで欲しいという作者の意図を無視した大変お行儀の悪いモジュールです。使うときは周りに誰もいないときの方が無難でしょう。

[]