TT の Multi Provider

CLON - 2006/11/27 - 複数のアプリで共通のテンプレートファイルを使う
これ、 [% INCLUDE 'common:foo.tt' %] とかしたとき、さらに foo.tt の中で [% INCLUDE 'bar.tt' %] とすると common:bar.tt がインクルードされてほしいのだけどそうはならないのがびみょい。

typester さんは カスタム TT::Provider を書いて解決なさってますけど,ちょっとだけださくないバージョンを考えてみました。

package Template::Context::TrackingProvider;

use strict;
use base qw( Template::Context );

sub template {
    my $self = shift;
    my $name = $_[0];

    if (! ref $name) {
        if ($name =~ m'^(\w+):'o) {
            my $prefix = $1;

            # ホントは SUPER::template() の後でやりたいけど支障なし
            $self->{ PREFIX_MAP }->{ default }
                = $self->{ PREFIX_MAP }->{ $prefix };
        }
    }

    return $self->SUPER::template(@_);
}

sub process {
    my $self = shift;

    my $backup = $self->{ PREFIX_MAP }->{ default };
    my $r = $self->SUPER::process(@_);
    $self->{ PREFIX_MAP }->{ default } = $backup;

    return $r;
}

1;

いろんな意味でだせぇ。

  • 名前がださい
  • 様々な例外条件チェック(PREFIX_MAP がない場合とか)をしてないのがださい
  • $backup とかださい*1

他,テンプレートをコンパイルした場合とかわかんないし,INCLUDE / PROCESS に複数引数を指定した場合がどうだかわかんないですけど,プロトタイプってことで。

追記

ちょっと修正した

*1:local 使うよりこっちのほうが短いんだもの