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