Catalyst::Controller::ActionRoleって...

action_rolesを指定して、コントローラ全体にmodifierかけると微妙だよね。
例えばこんな感じ。

package Umakatter::Web::Controller::Example;

use strict;
use warnings;
use base qw/Catalyst::Controller::ActionRole/;

__PACKAGE__->config(
    action_roles => ['~Example'],
);

sub index : Path : Args(0) {
    my ( $self , $c ) = @_;
}

1;

package Umakatter::Web::ActionRole::Example;

use Moose::Role;
after execute => sub {
    my ($self, $controller, $c) = @_;
    $c->response->body( 'run_' .  $c->response->body );
};

1;

結果

何回も走るよね....


_DISPATCH _BEGIN _AUTO _ACTION _END とか Action登録されてるから当たり前なんだけど、どうすれば1回だけ実行させることができるのかなぁ。


関数名でスキップすることはできるけど。

package Umakatter::Web::ActionRole::Example;

use Moose::Role;
after execute => sub {
    my ($self, $controller, $c) = @_;
    return if( $self->name =~ /^(_BEGIN|_AUTO|_ACTION|_END|_DISPATCH)$/ );
    $c->response->body( 'run_' .  $c->response->body );
};

1;
sub index : Path : Args(0) {
    my ( $self , $c ) = @_;

    $c->forward('hoge');
}

sub hoge : Local {

}

こうしたら、けっきょく2回よばれるからな。