From: Florian Ragwitz Date: Tue, 7 Jul 2009 14:33:39 +0000 (+0000) Subject: Add Exception::Interface and Exception::Basic. Make ::Base, ::Go and ::Detach use... X-Git-Tag: 5.80014~10^2~2 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=catagits%2FCatalyst-Runtime.git;a=commitdiff_plain;h=ede5238fd84cf5c03515d8b51792613a61c78f60 Add Exception::Interface and Exception::Basic. Make ::Base, ::Go and ::Detach use them. Failing tests due to issues when composing overloading methods from roles. --- diff --git a/lib/Catalyst/Exception.pm b/lib/Catalyst/Exception.pm index c8d5547..7506483 100644 --- a/lib/Catalyst/Exception.pm +++ b/lib/Catalyst/Exception.pm @@ -2,12 +2,6 @@ package Catalyst::Exception; # XXX: See bottom of file for Exception implementation -package Catalyst::Exception::Base; - -use Moose; -use Carp; -use namespace::clean -except => 'meta'; - =head1 NAME Catalyst::Exception - Catalyst Exception Class @@ -32,48 +26,6 @@ This is the Catalyst Exception class. Throws a fatal exception. -=cut - -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 $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; -} - -sub rethrow { - my ($self) = @_; - croak $self; -} - =head2 meta Provided by Moose @@ -89,19 +41,30 @@ it under the same terms as Perl itself. =cut -Catalyst::Exception::Base->meta->make_immutable; - -package Catalyst::Exception; +{ + package Catalyst::Exception::Base; -use Moose; -use namespace::clean -except => 'meta'; + use Moose; + use namespace::clean -except => 'meta'; -use vars qw[$CATALYST_EXCEPTION_CLASS]; + with 'Catalyst::Exception::Basic'; -BEGIN { - extends($CATALYST_EXCEPTION_CLASS || 'Catalyst::Exception::Base'); + __PACKAGE__->meta->make_immutable; } -__PACKAGE__->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'); + } + + __PACKAGE__->meta->make_immutable; +} 1; diff --git a/lib/Catalyst/Exception/Basic.pm b/lib/Catalyst/Exception/Basic.pm new file mode 100644 index 0000000..7d963e8 --- /dev/null +++ b/lib/Catalyst/Exception/Basic.pm @@ -0,0 +1,49 @@ +package Catalyst::Exception::Basic; + +use Moose::Role; +use Carp; +use namespace::clean -except => 'meta'; + +with 'Catalyst::Exception::Interface'; + +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 $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; +} + +sub rethrow { + my ($self) = @_; + croak $self; +} + +1; diff --git a/lib/Catalyst/Exception/Detach.pm b/lib/Catalyst/Exception/Detach.pm index 5f98119..926243d 100644 --- a/lib/Catalyst/Exception/Detach.pm +++ b/lib/Catalyst/Exception/Detach.pm @@ -3,7 +3,7 @@ package Catalyst::Exception::Detach; use Moose; use namespace::clean -except => 'meta'; -extends 'Catalyst::Exception'; +with 'Catalyst::Exception::Basic'; has '+message' => ( default => "catalyst_detach\n", diff --git a/lib/Catalyst/Exception/Go.pm b/lib/Catalyst/Exception/Go.pm index 6be9efe..50e416c 100644 --- a/lib/Catalyst/Exception/Go.pm +++ b/lib/Catalyst/Exception/Go.pm @@ -3,7 +3,7 @@ package Catalyst::Exception::Go; use Moose; use namespace::clean -except => 'meta'; -extends 'Catalyst::Exception'; +with 'Catalyst::Exception::Basic'; has '+message' => ( default => "catalyst_go\n", diff --git a/lib/Catalyst/Exception/Interface.pm b/lib/Catalyst/Exception/Interface.pm new file mode 100644 index 0000000..1bd603a --- /dev/null +++ b/lib/Catalyst/Exception/Interface.pm @@ -0,0 +1,8 @@ +package Catalyst::Exception::Interface; + +use Moose::Role; +use namespace::autoclean; + +requires qw/as_string throw rethrow/; + +1;