ziguzagu.org

CGI::App::Plugin::TTでテンプレートファイル名の自動生成

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