CGI::App::Plugin::Stashの使いどころ。
ひさびさにCGI::App。この間(英語で)質問メールが来たり、id:nekokakのコードをふまえて、
CGI::Application::Plugin::Stashをば。
$cgiapp->param('foo','bar');
が、
$cgiapp->stash->{foo} = 'bar';
と書ける"alternative for param()"な訳なんですが、
これが何が嬉しいかというと。
$cgiapp->param( 'foo', MyApp::DB->resultset('table')->search() );
を
$cgiapp->stash->{foo} = MyApp::DB->resultset('table')->search();
と、(すこし)エレガントに(当社比)書けるところ。右辺が複雑であれば効果は(多分)大きい。
ちなみにCGI::Application::Plugin::TTを使うと、template中でCGI::Applicationオブジェクトを、"c"で呼び出せる。
$cgiapp->tt_process('tmpl.tt',\%hash)
でデータを渡さなくても、param/stashでデータを入れておけば、
[% c.param('foo') %]
とかできる。Plugin::Stashを入れていれば、
[% c.stash.foo %]
となる。括弧がない分きれい(かも)。
こんな感じでparam/stashメソッドは使えるので、アプリケーションの作り方としてCatalystライクにparam/stashにデータを入れつつ、$cgiapp->forward
ってのありだと思う。
↓使った事ないけどこういうものありかな。
sub do_something{ my $self = shift; $self->stash->{template} = 'tmpl.tt'; $self->forward('templatize'); } sub templatize{ my $self = shift; $self->tt_process($self->stash->{template}); }
問題は、paramがper requestではないのでインスタンスが持続する起動方法をとった時には使えないことか。