1package DBIx::Class::Exception;
2
3use strict;
4use warnings;
5
6use Carp::Clan qw/^DBIx::Class/;
7use Scalar::Util qw/blessed/;
8
9use overload
10    '""' => sub { shift->{msg} },
11    fallback => 1;
12
13=head1 NAME
14
15DBIx::Class::Exception - Exception objects for DBIx::Class
16
17=head1 DESCRIPTION
18
19Exception objects of this class are used internally by
20the default error handling of L<DBIx::Class::Schema/throw_exception>
21to prevent confusing and/or redundant re-application of L<Carp>'s
22stack trace information.
23
24These objects stringify to the contained error message, and use
25overload fallback to give natural boolean/numeric values.
26
27=head1 METHODS
28
29=head2 throw
30
31=over 4
32
33=item Arguments: $exception_scalar, $stacktrace
34
35=back
36
37This is meant for internal use by L<DBIx::Class>'s C<throw_exception>
38code, and shouldn't be used directly elsewhere.
39
40Expects a scalar exception message.  The optional argument
41C<$stacktrace> tells it to use L<Carp/longmess> instead of
42L<Carp::Clan/croak>.
43
44  DBIx::Class::Exception->throw('Foo');
45  eval { ... }; DBIx::Class::Exception->throw($@) if $@;
46
47=cut
48
49sub throw {
50    my ($class, $msg, $stacktrace) = @_;
51
52    # Don't re-encapsulate exception objects of any kind
53    die $msg if blessed($msg);
54
55    # use Carp::Clan's croak if we're not stack tracing
56    if(!$stacktrace) {
57        local $@;
58        eval { croak $msg };
59        $msg = $@
60    }
61    else {
62        $msg = Carp::longmess($msg);
63    }
64
65    my $self = { msg => $msg };
66    bless $self => $class;
67
68    die $self;
69}
70
71=head2 rethrow
72
73This method provides some syntactic sugar in order to
74re-throw exceptions.
75
76=cut
77
78sub rethrow {
79    die shift;
80}
81
82=head1 AUTHORS
83
84Brandon L. Black <blblack@gmail.com>
85
86=head1 LICENSE
87
88You may distribute this code under the same terms as Perl itself.
89
90=cut
91
921;
93