CGI::Application::Plugin::DispatchRequestMethod 作ってみた #
昨日
の続き。
CGI::Application::Plugin::AutoRunmode
、CGI::Application::Plugin::ActionDispatch
を参考に書いてみた。他にもいろいろ参考にしてるので、コピペ祭りの様相
package CGI::Application::Plugin::DispatchRequestMethod;
use strict;
use warnings;
use base qw(Exporter);
use Class::Inspector;
sub import {
my $caller = scalar(caller);
$caller->add_callback('prerun', ?&_prerun_callback_test);
goto &Exporter::import;
}
sub _prerun_callback_test {
my $self = shift;
my $class = ref $self || $self;
# initialize runmode
my %runmodes = $self->run_modes();
my $request_method = uc($self->query->request_method);
for my $method_name ( map {${$_}[2]} @{Class::Inspector->methods($class, 'expanded','public') || [[]]} ) {
next if exists $runmodes{$method_name};
if (
( $method_name =~ /^post_dispatch_(?w+)$/ and $request_method eq 'POST' )
or
( $method_name =~ /^put_dispatch_(?w+)$/ and $request_method eq 'PUT' )
or
( $method_name =~ /^delete_dispatch_(?w+)$/ and $request_method eq 'DELETE' )
or
( $method_name =~ /^get_dispatch_(?w+)$/ )
) {
$self->run_modes( $1, $method_name);
}
}
}
1;
使い方は大体こんな感じ。
package MyApp;
use strict;
use warnings;
use CGI::Application::Plugin::Dispatch
sub setup {
my $self = shift;
$self->start_mode('default');
$self->run_modes(
AUTOLOAD => 'get_dispatch_hoge',
);
}
sub get_dispatch_hoge { # GET /MyApp/hoge の時実行
my $self = shift;
.
.
.
.
return $self->tt_process or die $self->tt_error;
}
sub post_dispatch_hoge { # POST /MyApp/hoge の時実行
my $self = shift;
.
.
.
.
return $self->tt_process or die $self->tt_error;
}
run_mode が hoge の時、REQUEST_METHOD によって get_dispatch_hoge、post_dispatch_hoge、put_dispatch_hoge、delete_dispatch_hoge をそれぞれ実行する。put_dispatch と delete_dispatch は、現状 XMLHttpRequest 用だな。
なんか Attribute の指定はいらんような気がするし、HTTP header になんかいれるのを汎用化するいい方法を思いつかないし、当面これでいいか。