CGI::AppでのDebugScreenその2

かぜぶろさんに改良してもらったDebugScreenをさらに改良してみました。
HTMLはそのままwこれもそのうちCGI::App風な色使いに変えよう。

とりあえず改良?してみたコード↓(importとdebug_reportのみ)


sub import {
my $caller = scalar caller;
$caller->add_callback( 'init', sub{
my $self = shift;
my $died;
$SIG{__DIE__} = sub{
if ( $died ) {die @_}
$self->debug_report(@_);
$died++;
};
});
no strict 'refs';
*{"$caller\::debug_report"} = \&debug_report;
}
sub debug_report{
my $self = shift;
my $desc = shift;
my $vars = {
desc => $desc,
title => ref $self || $self,
context => \&print_context,
};
$vars->{stacktrace} = [Devel::StackTrace->new(ignore_package=>[qw/CGI::Application::Plugin::DebugScreen Carp CGI::Carp/])->frames];
my $t = Template->new;
my $output;
$t->process(\$TEMPLATE, $vars, \$output);
$self->header_props( -type => 'text/html' );
my $headers = $self->_send_headers();
print $headers.$output;
}

1.CGI::CarpもDevel::StackTrace対象外モジュールに追加
2.$SIG{__DIE__}に変更。変更によって全てのdieが拾われるので、初めの一個目だけを拾うように。
  理由は$caller::SIG{__DIE__}だと、継承継承継承。。。とされている場合、上手くトラップできないので。
  間違ってたら突っ込みお願いします。

こんなんでどうですか?

(追記)
はまったこと。。。
use CGI::Carp qw(fatalsToBrowser);を使ってたから、
$SIG{__DIE__}内のdieをひろって画面にでてしまって、なんでだ!!!と
混乱しまくりますた^^;