has
'trace'
=> (
is
=>
'ro'
,
builder
=>
'_build_trace'
,
lazy
=> 1,
);
sub
_build_trace {
my
$self
=
shift
;
my
$skip
= 0;
while
(
my
@c
=
caller
(++
$skip
)) {
last
if
(
$c
[3] =~ /^(.*)::new$/ ||
$c
[3] =~ /^\S+ (.*)::new \(
defined
at /)
&&
$self
->isa($1);
}
$skip
++;
Devel::StackTrace->new(
message
=>
$self
->message,
indent
=> 1,
skip_frames
=>
$skip
,
no_refs
=> 1,
);
}
has
'message'
=> (
is
=>
'ro'
,
builder
=>
'_build_message'
,
lazy
=> 1,
required
=> 1,
);
sub
_build_message {
"Error"
}
q{""}
=>
'as_string'
,
bool
=>
sub
() { 1 },
fallback
=> 1,
);
sub
BUILD {
shift
->trace }
sub
as_string {
my
$self
=
shift
;
if
(
$ENV
{VALIANT_FULL_EXCEPTION} ) {
return
$self
->trace->as_string;
}
my
@frames
;
my
$last_frame
;
my
$in_moose
= 1;
for
my
$frame
(
$self
->trace->frames ) {
if
(
$in_moose
&&
$frame
->
package
=~ /^(?:Valiant)(?::|$)/ )
{
$last_frame
=
$frame
;
next
;
}
elsif
(
$last_frame
) {
push
@frames
,
$last_frame
;
undef
$last_frame
;
}
$in_moose
= 0;
push
@frames
,
$frame
;
}
return
$self
->trace->as_string
unless
@frames
;
my
$message
= (
shift
@frames
)->as_string( 1, {} ) .
"\n"
;
$message
.=
join
q{}
,
map
{
$_
->as_string( 0, {} ) .
"\n"
}
@frames
;
return
$message
;
}
sub
throw {
my
(
$class
,
@args
) =
@_
;
die
$class
->new(
@args
);
}
sub
rethrow {
die
shift
}
1;