CGI::Applicationでのエラーハンドリング

ってほどでも無いのですが、
覚書き程度にでも。

これまた、前にやった「CGI::Application::Dispatchを遊んでみる」の
例を使って。

あんまり凝ったことやってません。
あくまで覚書ですので^^;

以下ソース

Neko.pm


package Neko;
use strict;
use warnings;
use base qw(CGI::Application Class::ErrorHandler);
sub cgiapp_init {
my $self = shift;
$self->tmpl_path('./template/');
}
sub cgiapp_prerun {
my $self = shift;
$self->header_add(-type => 'text/html; charset=UTF-8');
}
1;

Neko/Parse.pm


package Neko::Parse;
use strict;
use warnings;
use base 'Neko';
use LWP::UserAgent;
use XML::RSS;
use CGI::Application::Plugin::FillInForm (qw/fill_form/);
sub setup {
my $self = shift;
$self->start_mode('parse');
$self->error_mode('do_parse_err');
$self->run_modes(
'parse' => \&do_parse,
);
}
sub do_parse {
my $self = shift;
if($self->get_xml){
die $self->error($self->{'error'});
}
my $rss = XML::RSS->new();
eval{$rss->parse($self->{'xml'})} or die $self->error('Parse Error');
my @entries;
for(@{$rss->{'items'}}){
my %entries;
$entries{title} = $_->{title};
$entries{link} = $_->{link};
$entries{creator} = $_->{dc}->{creator};
$entries{date} = $_->{dc}->{date};
$entries{description} = $_->{description};
$entries{description} =~ s/<p>|<\/p>//g;
push @entries, \%entries;
}
my $t = $self->load_tmpl('parse.html',die_on_bad_params => 0,);
$t->param(parse_info => \@entries);
return $self->fill_form( \$t->output );
}
sub get_xml {
my $self = shift;
my $ua = LWP::UserAgent->new();
my $q = $self->query();
my $req = HTTP::Request->new('GET',$q->param("target_uri"));
if($ua->request($req)->is_success) {
$self->{'xml'} = $ua->request($req)->content;
return 0;
}else{
$self->{'error'} = $ua->request($req)->status_line;
return 1;
}
}
sub do_parse_err{
my $self = shift;
my $errmsg = shift;
my $t = $self->load_tmpl('index.html',die_on_bad_params => 0,);
$t->param(error_info => [ {errormsg => $self->errstr} ]);
return $self->fill_form( \$t->output );
}
1;

こんな感じになるのかな?
setup時にerror_mode('do_parse_err')を設定しておき、
エラーにしたいところをdieさせてまふ。

こんなんどないだしょ?