« HTML::Template::Plugin::Dotを使ってみた | メイン | Class::DBI関連モジュール »

CGI::Applicationでpost_dispatch

CGI::Applicationで、Sledgeでいうところのpost_dispatch_hogehogeが欲しいなと思ってCGI::ApplicationのPluginのCGI::Application::Plugin::Dispatchをこしらえた。post_dispatch_hogehogeだけではなく、run_modesを設定しなくても、dispatch_hogehogeを書いていくだけで済みます。
↓のような感じです。

package TestApp::PluginDispatch;

use strict;
use base qw(CGI::Application);
use CGI::Application::Plugin::Dispatch;#プラグイン読み込み

sub setup{
	my $self = shift;
	$self->mode_param(path_info=>1);	
	$self->start_mode('index');
}
sub dispatch_index{
	my $self=shift;
}
sub dispatch_search{
	my $self=shift;
	#post_dispatch_searchを下で定義しているのでGETの時のみ
}
sub post_dispatch_search{
	my $self=shift;
	#RUNモードがsearchでPOSTメソッドの時実行
}

run_modesを設定しなくて良いのですこし楽。post_dispatchを呼び出さないのであればどこかに、

$self->post_dispatch(0);

としておく。プラグインの構造としては、init時にcallbackで、run_modesにAUTOLOADを追加してます。

$self->run_modes(
	'AUTOLOAD'=>'dispatch'
);

CGI::Appは該当するrunモードがなく、AUTOLOADが設定されている場合、AUTOLOADで指定されたメソッドを呼び出します。ここではdispatchメソッドになります。dispatch内では必要あれば「post_dispatch_hoge」、もしくは「dispatch_hoge」を実行します

前回のHTML::Template::Plugin::Dotのサンプルをちょっといじって実装
検索がpostメソッドになっただけです。getで直接アクセスすると検索が行われません。

ソースはこちら