package DBIx::Class::Exception;
use strict;
-use vars qw[@ISA $DBIC_EXCEPTION_CLASS];
-use UNIVERSAL::require;
+use warnings;
-BEGIN {
- push( @ISA, $DBIC_EXCEPTION_CLASS || 'DBIx::Class::Exception::Base' );
-}
-
-package DBIx::Class::Exception::Base;
+use Carp::Clan qw/^DBIx::Class|^Try::Tiny/;
+use Scalar::Util qw/blessed/;
+use Try::Tiny;
-use strict;
-use Carp ();
+use overload
+ '""' => sub { shift->{msg} },
+ fallback => 1;
=head1 NAME
-DBIx::Class::Exception - DBIC Exception Class
+DBIx::Class::Exception - Exception objects for DBIx::Class
-=head1 SYNOPSIS
+=head1 DESCRIPTION
- DBIx::Class::Exception->throw( qq/Fatal exception/ );
+Exception objects of this class are used internally by
+the default error handling of L<DBIx::Class::Schema/throw_exception>
+to prevent confusing and/or redundant re-application of L<Carp>'s
+stack trace information.
-See also L<DBIx::Class>.
+These objects stringify to the contained error message, and use
+overload fallback to give natural boolean/numeric values.
-=head1 DESCRIPTION
+=head1 METHODS
-This is a generic Exception class for DBIx::Class. You can easily
-replace this with any mechanism implementing 'throw' by setting
-$DBix::Class::Exception::DBIC_EXCEPTION_CLASS
+=head2 throw
-=head1 METHODS
+=over 4
-=head2 throw( $message )
+=item Arguments: $exception_scalar, $stacktrace
-=head2 throw( message => $message )
+=back
-=head2 throw( error => $error )
+This is meant for internal use by L<DBIx::Class>'s C<throw_exception>
+code, and shouldn't be used directly elsewhere.
-Throws a fatal exception.
+Expects a scalar exception message. The optional argument
+C<$stacktrace> tells it to use L<Carp/longmess> instead of
+L<Carp::Clan/croak>.
+
+ DBIx::Class::Exception->throw('Foo');
+ try { ... } catch { DBIx::Class::Exception->throw(shift) }
=cut
sub throw {
- my $class = shift;
- my %params = @_ == 1 ? ( error => $_[0] ) : @_;
+ my ($class, $msg, $stacktrace) = @_;
+
+ # Don't re-encapsulate exception objects of any kind
+ die $msg if blessed($msg);
- my $message = $params{message} || $params{error} || $! || '';
+ # use Carp::Clan's croak if we're not stack tracing
+ if(!$stacktrace) {
+ try { croak $msg } catch { $msg = shift };
+ }
+ else {
+ $msg = Carp::longmess($msg);
+ }
- local $Carp::CarpLevel = (caller(1) eq 'NEXT' ? 2 : 1);
+ my $self = { msg => $msg };
+ bless $self => $class;
- Carp::croak($message);
+ die $self;
}
-=head1 AUTHOR
+=head2 rethrow
+
+This method provides some syntactic sugar in order to
+re-throw exceptions.
-Marcus Ramberg <mramberg@cpan.org>
+=cut
+
+sub rethrow {
+ die shift;
+}
-=head1 THANKS
+=head1 AUTHORS
-Thanks to the L<Catalyst> framework, where this module was borrowed
-from.
+Brandon L. Black <blblack@gmail.com>
-=head1 COPYRIGHT
+=head1 LICENSE
-This program is free software, you can redistribute it and/or modify
-it under the same terms as Perl itself.
+You may distribute this code under the same terms as Perl itself.
=cut