tokuhirom's Blog

Tfall あらため Tiffany

Tfall は、よみかたがわからないといった声があったので、miyagawa さんからつけてもらった Tiffany というのおに名前をかえました。

あと、Factory メソッドもついて

my $t = Tiffany->load('Text::Xslate', {syntax => 'TTerse'});
$t->render('foo.tt', {name => 'john'});

みたいによべるようになりましたですよ。

現実的なフレームワークでは以下のようなかんじでつかうとよいでしょう。

package MyWAF;
use paernt qw/Class::Data::Inheritable/;
__PACKAGE__->mk_classdata('view');
__PACKAGE__->mk_classadata('config');

sub init {
    my $class = shift;
    $class->init_config();
    $class->init_view();
}

sub init_view {
    my $class = shift;
    my $view_class = $class->config->{view_class};
    my $view = Tiffany->new($view_class, $class->config->{$view_class});
    $class->view($view);
}

sub render {
    my $self = shift;
     my $html = encode_utf8($self->view->render(@_));
    return Plack::Response->new(200, ['Content-Type' => 'text/html;charset=utf-8', 'Content-Length' => length($html)], [$html]);
}


あと、基本的には ruby の Tilt 的なのがほしいなーとおもってはじめたプロジェクトなわけですが、Tilt のインターフェースは正直、つかいやすいかんじがしなかったので、結局不採用としました。

つまり、Tilt では以下のように、拡張子からレンダラーを lookup するわけですが、このアプローチはよくないとおもう。

template = Tilt.new('templates/foo.erb')
# => #<Tilt::ERBTemplate @file="templates/foo.rb" ...>
output = template.render
# => "Hello world!"

そもそも拡張子でテンプレートファイルふりわけるとか必要ないし、複数のテンプレートエンジンをひとつのプロジェクトの中でつかいわけるとかしないし、テンプレートエンジンには設定をわたす必要がある。

で、現実的にはほとんどつかいそうにないし、つかうならつかうで拡張子から load するためのインターフェースを別途作成するのがよいとおもわれる。