CGI::Application::Plugin::DispatchRequestMethod 作ってみた

CGI::Application::Plugin::DispatchRequestMethod 作ってみた #

昨日 の続き。
CGI::Application::Plugin::AutoRunmodeCGI::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 になんかいれるのを汎用化するいい方法を思いつかないし、当面これでいいか。

See Also

Copyright © 髭。/ Hugo + hugo-book