Amon2で$c->render()をwrapした$c->auto_render()を作ってみた(改)

以前書いた、
Amon2で$c->render()をwrapした$c->auto_render()を作ってみた。
と、
Amon2で$c->stashを使う。
を組み合わせてみた。

まずは、$cにauto_renderを追加。

sub auto_render {
    my $self = shift;

    my $template = '';
    if ( $self->stash->{'template'} ) {
        # コントローラーで($c->stashに)templateが指定されてる場合はそっちを使う
        $template = $self->stash->{'template'};
    }
    else {
        # templateが指定されてない場合は、呼んだコントローラーと同じpathのファイルを使う
        my $path = (caller 1)[3];
        $path =~ s/MyApp::Web::C:://;
        $path =~ s/\:\:/\//g;
        $path = lc $path;
        $template = $path . '.tt';
    }

    return $self->render($template, $self->stash );
}

テンプレートのpathのとこは、前に書いたやつとほぼ同じ。
意図的に別のテンプレートを使いたい場合もありそうなんで、$c->stash->{template}が指定されていればそっちを使うようにした。(Catalystライクな動きです)

で、コントローラ。

sub index {
    my ( $class, $c ) = @_;

    $c->stash->{'user_id'} = 1;

    # templateもstashも送る必要なし
    $c->auto_render();
}

sub info {
    my ( $class, $c ) = @_;

    # templateを指定したい場合。
    $c->stash->{'template'} = 'info/detail.tt';
    $c->auto_render();
}

/indexは、templateを指定していないのでroot/index.ttが使われる。
/infoは、templateにinfo/detail.ttを指定したので、そっちが使われる。