« CGI::ApplicationでTropy | メイン | PostgreSQLのVACUUM FULLはいつ必要か。 »

CGI::ApplicationでもCatalyst風にStash

CGI::AppでTropyを作る過程で思いついたプラグイン。
CGI::AppでもCatalystでも同じ感じでアプリが組めたら便利かなと思う。

package CGI::Application::Plugin::Stash;

use strict;
use warnings;
use vars qw($VERSION @EXPORT);
require Exporter;

@EXPORT = qw(stash);
$VERSION = '0.01';

sub import { goto &Exporter::import }

sub stash{
    my $self = shift;
    
    # First use?  Create new __PARAMS!
    $self->{__PARAMS} = {} unless (exists($self->{__PARAMS}));
    
    if (@_) {
        my $stash = @_ > 1 ? {@_} : $_[0];
        while ( my ( $key, $val ) = each %$stash ) {
            $self->{__PARAMS}->{$key} = $val;
        }
    }
    
    return $self->{__PARAMS};
}

1;

このコードはまだ試していないんだけど、

$self->param('foo','yada');
$self->stash->{foo} = 'yada';

の結果は同じハズ。

あとでCaropyに組込んでみよう。

CGI::Application::Plugin::FormValidator::SimpleもCatalystと同じように使えていい感じです。
Ver. 0.01で気になったvalidatorのSkipについて作者のmiyashita氏にお願いしたところすぐに対応していただきました。さらに便利になりました。ありがとうございます。

追記。
Caropyにつかってみた
テンプレート中で、

[% c.param('entry').title | html %]

ではなく、

[% c.stash.entry.title | html %]

と書ける。微妙にいい感じ。


追記。
CPANにアップしました。