X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FCatalyst%2FException.pm;h=c8d55479618b1083df0839789465f58bad03ce7f;hb=009b5b2324f83396439a494a56684efb60eb2cd8;hp=41b411ae9ecd9c2f013c964e1a2e882d24a69945;hpb=2f3812528068bc1d9f7840067f0c03d36cd47e6d;p=catagits%2FCatalyst-Runtime.git diff --git a/lib/Catalyst/Exception.pm b/lib/Catalyst/Exception.pm index 41b411a..c8d5547 100644 --- a/lib/Catalyst/Exception.pm +++ b/lib/Catalyst/Exception.pm @@ -5,7 +5,8 @@ package Catalyst::Exception; package Catalyst::Exception::Base; use Moose; -use Carp (); +use Carp; +use namespace::clean -except => 'meta'; =head1 NAME @@ -33,15 +34,44 @@ Throws a fatal exception. =cut -sub throw { - my $class = shift; - my %params = @_ == 1 ? ( error => $_[0] ) : @_; +has message => ( + is => 'ro', + isa => 'Str', + default => sub { $! || '' }, +); + +use overload + q{""} => \&as_string, + fallback => 1; + +sub as_string { + my ($self) = @_; + return $self->message; +} + +around BUILDARGS => sub { + my ($next, $class, @args) = @_; + if (@args == 1 && !ref $args[0]) { + @args = (message => $args[0]); + } - my $message = $params{message} || $params{error} || $! || ''; + my $args = $class->$next(@args); + $args->{message} ||= $args->{error} + if exists $args->{error}; + return $args; +}; + +sub throw { + my $class = shift; + my $error = $class->new(@_); local $Carp::CarpLevel = 1; + croak $error; +} - Carp::croak($message); +sub rethrow { + my ($self) = @_; + croak $self; } =head2 meta @@ -54,7 +84,7 @@ Catalyst Contributors, see Catalyst.pm =head1 COPYRIGHT -This program is free software, you can redistribute it and/or modify +This library is free software. You can redistribute it and/or modify it under the same terms as Perl itself. =cut @@ -64,13 +94,14 @@ Catalyst::Exception::Base->meta->make_immutable; package Catalyst::Exception; use Moose; +use namespace::clean -except => 'meta'; + use vars qw[$CATALYST_EXCEPTION_CLASS]; BEGIN { extends($CATALYST_EXCEPTION_CLASS || 'Catalyst::Exception::Base'); } -no Moose; __PACKAGE__->meta->make_immutable; 1;