CGI::Application::Plugin::TTのTEMPLATE_NAME_GENERATORオプションを使って、テンプレートファイル名を自動的に生成する、というのをやってみました。
デフォルトのジェネレーターは、パッケージ名をそのまま使うので
- ディレクトリ名に大文字があってなんかキモイ
- 名前空間の先頭パッケージ名もディレクトリ名に含まれるのがなんか冗長
という点がちょっといまいちです。たとえば、MyApp::Fooクラスのbarメソッドが呼び出された場合は、
/path/to/tmpl/MyApp/Foo/bar.tmpl
という感じです。ディレクトリ名は全部小文字、先頭パッケージ名はいらん、というのがオレオレルールなのでそいつを生成するようにやってみました。
package MyApp;
use strict;
use warnings;
use base qw/CGI::Application/;
use CGI::Application::Plugin::TT;
use CGI::Application::Plugin::Stash;
use CGI::Application::Plugin::Config::YAML;
sub cgiapp_init {
my $self = shift;
$self->config_file('memo.yaml');
$self->tt_config(
TEMPLATE_OPTIONS => {
INCLUDE_PATH => $self->config_param->{tt}->{include},
COMPILE_DIR => $self->config_param->{tt}->{cache},
},
TEMPLATE_NAME_GENERATOR => \&_template_name_gen,
);
$self->start_mode('default');
}
sub _template_name_gen {
my $self = shift;
my @dirs = split /::/, ref $self;
shift @dirs;
my $dir = lc File::Spec->catdir(@dirs);
my ($base) = (caller(2))[3] =~ /([^:]+)$/;
if ($base eq 'tt_process') {
($base) = (caller(3))[3] =~ /([^:]+)$/;
}
return File::Spec->catfile($dir, $base . '.tmpl');
}
1;
デフォルトのジェネレーター__tt_template_nameからほとんどもってきました。これで、MyApp::Fooのbarメソッドからtt_processが呼ばれたときに作るテンプレートファイル名は、
/path/to/tmpl/foo/bar.tmpl
となります。やた。
CGI::Application::Plugin::Stashも一緒に使うことで、引数なしのすっきりtt_processになります。
package MyApp::Foo;
use strict;
use warnings;
use base qw/MyApp/;
sub setup {
my $self = shift;
$self->run_modes(
'default' => 'bar',
);
}
sub bar {
return $self->tt_process;
}
1;
個人的にはうれしいけど、みんなうれしいかは不明。。。
さて、明日はいよいよYAPC::Asia 2006です。懇親会にも参加できるのでいろいろ楽しみです。でも、懇親会とかには参加したことがないので、自分のことを知っている人はまったくいないはず。。。
壁より壁らしく見えるほど無口な、茶髪のチビを発見したら声をかけてあげてくださいw