blob: 9cb608101cbc1866d8be07575ab921ed95c1cc01 [file] [log] [blame]
require Carp;
require Carp::Heavy;
use APR::Util ();
use overload
nomethod => \&fatal,
'bool' => \&str,
'==' => \&num_cmp,
'!=' => \&num_cmp_not,
'0+' => \&num,
'""' => \&str;
sub fatal { die __PACKAGE__ . ": Can't handle '$_[3]'" }
# normally the object is created on the C side, but if you want to
# create one from Perl, you can. just pass a hash with args:
# rc, file, line, func
sub new {
my $class = shift;
my %args = @_;
bless \%args, $class;
}
#
# - even though most of the time the error id is not useful to the end
# users, developers may need to know it. For example in case of a
# non-english user locale setting, the error string could be
# incomprehensible to a developer, but by having the error id it's
# possible to find the english equivalent
# - the filename and line number are needed because perl doesn't
# provide that info when exception objects are involved
sub str {
return sprintf "%s: (%d) %s at %s line %d", $_[0]->{func},
$_[0]->{rc}, APR::Error::strerror($_[0]->{rc}),
$_[0]->{file}, $_[0]->{line};
}
sub num { $_[0]->{rc} }
sub num_cmp { $_[0]->{rc} == $_[1] }
sub num_cmp_not { $_[0]->{rc} != $_[1] }
# skip the wrappers from this package from the long callers trace
$Carp::CarpInternal{+__PACKAGE__}++;
# XXX: Carp::(confess|cluck) see no calls stack when Perl_croak is
# called with (char *)NULL (which is the way exception objects are
# returned), so we fixup it here (doesn't quite work for croak
# caller).
sub cluck {
if (ref $_[0] eq __PACKAGE__) {
Carp::cluck("$_[0]->{func}: ($_[0]->{rc}) " .
APR::Error::strerror($_[0]->{rc}));
}
else {
&Carp::cluck;
}
}
sub confess {
if (ref $_[0] eq __PACKAGE__) {
Carp::confess("$_[0]->{func}: ($_[0]->{rc}) " .
APR::Error::strerror($_[0]->{rc}));
}
else {
&Carp::confess;
}
}