column foo => type is 'text'ってなんだ
そういえばJiftyというPerlのフレームワークがあったなと思い、
http://www.tcool.org/jifty/Tutorial.html
を読んでいたら、モデルクラスでデータ構造を定義するときにこんな構文を使っていた。
column title => type is 'text', label is 'Title', default is 'Untitled post'; column body => type is 'text', label is 'Content', render_as 'Textarea';
まあ、ぱっと見でどういう意味なのかってのはわかるんだけど、どういう仕組みになってるのか気になる気になる。
というわけで調べてみた。
Jifty::DBI::Schema - Use a simple syntax to describe a Jifty table. - metacpan.org
columnとかはサブルーチンなんですね。上の例ではcolumn type is label defaults render_asがサブルーチン。実質的な処理はcolumnで行い、あとのやつはヘルパー的な役回り。たとえばtypeやlabelは
type => 'text'
とか
label => 'Title'
というようなハッシュを返すだけだし、isは引数をそのまま返すだけ。
そんなわけで、さっきのコードはこのように書き換えることができます(カッコはおまけ)。
column( title => ( type => 'text', label => 'Title', defaults => 'Untitled post', ) ); column( body => ( type => 'text', label => 'Content', render_as => 'Textarea', ) );
なるほどねー。それにしても、こーいうことよく思いつくよなと感心してしまいます。
最後に簡単な模擬コードを書いてみました。
#!/usr/bin/perl use strict; use warnings; sub column; sub type($); sub label($); sub is($); column title => type is 'text', label is 'Title'; sub column { my ( $name, %args ) = @_; print $name, "?n"; while ( my ( $key, $value ) = each %args ) { print "$key : $value?n"; } } sub type ($) { return type => shift; } sub label ($) { return label => shift; } sub is ($) { return shift; }
まだ1%くらい疑ってたんだけど、なんの警告もなくちゃんと動きました。
takatoshi@sarge:~/temp/src$ ./column.pl title label : Title type : text