tokuhirom's Blog

Re: Text::Xslate::Bridge::FillInForm::Lite

http://blog.vitamin11.org/2012/09/released-textxslatebridgefillinformlite.html

こういう単機能なラッパーモジュールをつくらなくていいようにしたいね、という話が Xslate の開発当初からあって(というか俺がいってて)、こういうのがでてくるのは申しわけないなあ、とおもった(書いた人が残念なのではなく、そういうのを書きたいとおもわせるにいたった開発コミュニティが残念です)。
TT はやたらラッパーモジュールであふれていて、だいぶ馬鹿馬鹿しい状況になっていたので、それを再現したくはなかったのです。Template::Plugin::* ほんとやたら数あるけど、Xslate の場合はそれがなくていいように module option がつかえるようになっているわけですナ。

という前提があった上で、汎用的につかえる解決策を思案してみる。

module option は実際のところ import メソッドへの引数をわたせるようになっていて、以下のようにすれば

template: "xslate"
engines:
  xslate:
    module:
      - "HTML::FillInForm::Lite"
      - ['fillinform']

以下のようにかける

: block form | fillinform($q) | raw -> {
    <form>
        <input name="foo" type="text" />
        <input name="bar" type="text" />
    </form>
: }

ので、だいたいの人はこれで満足できるんじゃないかなあ。

"| raw" の指定がどうしても嫌、というのはわからなくもないので、raw 指定つきで import する機能が Dancer::Template::Xslate か Xslate についててもいいかもな、とおもった。

(そもそも今時 YAML で view の設定をさせようという Dancer がいけてないなあ、とおもうけどそれはまた別のおはなし。)

【追記】
また、第2案として | raw が嫌なんであれば

module => ['Text::Xslate::HTMLBuilderImporter" => ["HTML::FillInForm::Lite" => "fillinform"]]

みたいにできる、html_builder つきで import するだけのモジュールを提供することにより、プラギン地獄からのがれるという手もあるかな、とおもった。

【追記】

diff --git a/lib/Text/Xslate.pm b/lib/Text/Xslate.pm
index e58e99a..21523b1 100644
--- a/lib/Text/Xslate.pm
+++ b/lib/Text/Xslate.pm
@@ -210,6 +210,14 @@ sub new {
             Text::Xslate::Util::import_from(@{$args{module}}));
     }
 
+    # user-defined html builders
+    if(defined $args{html_builder}) {
+        my $raw = Text::Xslate::Util::import_from(@{$args{html_builder}});
+        $self->_merge_hash(\%funcs,
+            +{ map { my $code = $raw->{$_};
+                $_ => &Text::Xslate::Util::html_builder($raw->{$_}) } keys %$raw });
+    }
+
     $self->_merge_hash(\%funcs, $arg_function);
 
     $self->_resolve_function_aliases(\%funcs);

こんなかんじかなあ。