Blame lib/Specio/Exception.pm

Packit 42cdad
package Specio::Exception;
Packit 42cdad
Packit 42cdad
use strict;
Packit 42cdad
use warnings;
Packit 42cdad
Packit 42cdad
use overload
Packit 42cdad
    q{""}    => 'as_string',
Packit 42cdad
    fallback => 1;
Packit 42cdad
Packit 42cdad
our $VERSION = '0.42';
Packit 42cdad
Packit 42cdad
use Devel::StackTrace;
Packit 42cdad
use Scalar::Util qw( blessed );
Packit 42cdad
use Specio::OO;
Packit 42cdad
Packit 42cdad
{
Packit 42cdad
    my $attrs = {
Packit 42cdad
        message => {
Packit 42cdad
            isa      => 'Str',
Packit 42cdad
            required => 1,
Packit 42cdad
        },
Packit 42cdad
        type => {
Packit 42cdad
            does     => 'Specio::Constraint::Role::Interface',
Packit 42cdad
            required => 1,
Packit 42cdad
        },
Packit 42cdad
        value => {
Packit 42cdad
            required => 1,
Packit 42cdad
        },
Packit 42cdad
        stack_trace => {
Packit 42cdad
            init_arg => undef,
Packit 42cdad
        },
Packit 42cdad
    };
Packit 42cdad
Packit 42cdad
    ## no critic (Subroutines::ProhibitUnusedPrivateSubroutines)
Packit 42cdad
    sub _attrs {
Packit 42cdad
        return $attrs;
Packit 42cdad
    }
Packit 42cdad
}
Packit 42cdad
Packit 42cdad
sub BUILD {
Packit 42cdad
    my $self = shift;
Packit 42cdad
Packit 42cdad
    $self->{stack_trace}
Packit 42cdad
        = Devel::StackTrace->new( ignore_package => __PACKAGE__ );
Packit 42cdad
Packit 42cdad
    return;
Packit 42cdad
}
Packit 42cdad
Packit 42cdad
sub as_string {
Packit 42cdad
    my $self = shift;
Packit 42cdad
Packit 42cdad
    my $str = $self->message;
Packit 42cdad
    $str .= "\n\n" . $self->stack_trace->as_string;
Packit 42cdad
Packit 42cdad
    return $str;
Packit 42cdad
}
Packit 42cdad
Packit 42cdad
sub throw {
Packit 42cdad
    my $self = shift;
Packit 42cdad
Packit 42cdad
    die $self if blessed $self;
Packit 42cdad
Packit 42cdad
    die $self->new(@_);
Packit 42cdad
}
Packit 42cdad
Packit 42cdad
__PACKAGE__->_ooify;
Packit 42cdad
Packit 42cdad
1;
Packit 42cdad
Packit 42cdad
# ABSTRACT: An exception class for type constraint failures
Packit 42cdad
Packit 42cdad
__END__
Packit 42cdad
Packit 42cdad
=pod
Packit 42cdad
Packit 42cdad
=encoding UTF-8
Packit 42cdad
Packit 42cdad
=head1 NAME
Packit 42cdad
Packit 42cdad
Specio::Exception - An exception class for type constraint failures
Packit 42cdad
Packit 42cdad
=head1 VERSION
Packit 42cdad
Packit 42cdad
version 0.42
Packit 42cdad
Packit 42cdad
=head1 SYNOPSIS
Packit 42cdad
Packit 42cdad
  use Try::Tiny;
Packit 42cdad
Packit 42cdad
  try {
Packit 42cdad
      $type->validate_or_die($value);
Packit 42cdad
  }
Packit 42cdad
  catch {
Packit 42cdad
      if ( $_->isa('Specio::Exception') ) {
Packit 42cdad
          print $_->message, "\n";
Packit 42cdad
          print $_->type->name, "\n";
Packit 42cdad
          print $_->value, "\n";
Packit 42cdad
      }
Packit 42cdad
  };
Packit 42cdad
Packit 42cdad
=head1 DESCRIPTION
Packit 42cdad
Packit 42cdad
This exception class is thrown by Specio when a type check fails. It emulates
Packit 42cdad
the L<Throwable::Error> API, but doesn't use that module to avoid adding a
Packit 42cdad
dependency on L<Moo>.
Packit 42cdad
Packit 42cdad
=for Pod::Coverage BUILD throw
Packit 42cdad
Packit 42cdad
=head1 API
Packit 42cdad
Packit 42cdad
This class provides the following methods:
Packit 42cdad
Packit 42cdad
=head2 $exception->message
Packit 42cdad
Packit 42cdad
The error message associated with the exception.
Packit 42cdad
Packit 42cdad
=head2 $exception->stack_trace
Packit 42cdad
Packit 42cdad
A L<Devel::StackTrace> object for the exception.
Packit 42cdad
Packit 42cdad
=head2 $exception->type
Packit 42cdad
Packit 42cdad
The type constraint object against which the value failed.
Packit 42cdad
Packit 42cdad
=head2 $exception->value
Packit 42cdad
Packit 42cdad
The value that failed the type check.
Packit 42cdad
Packit 42cdad
=head2 $exception->as_string
Packit 42cdad
Packit 42cdad
The exception as a string. This includes the method and the stack trace.
Packit 42cdad
Packit 42cdad
=head1 OVERLOADING
Packit 42cdad
Packit 42cdad
This class overloads stringification to call the C<as_string> method.
Packit 42cdad
Packit 42cdad
=head1 SUPPORT
Packit 42cdad
Packit 42cdad
Bugs may be submitted at L<https://github.com/houseabsolute/Specio/issues>.
Packit 42cdad
Packit 42cdad
I am also usually active on IRC as 'autarch' on C<irc://irc.perl.org>.
Packit 42cdad
Packit 42cdad
=head1 SOURCE
Packit 42cdad
Packit 42cdad
The source code repository for Specio can be found at L<https://github.com/houseabsolute/Specio>.
Packit 42cdad
Packit 42cdad
=head1 AUTHOR
Packit 42cdad
Packit 42cdad
Dave Rolsky <autarch@urth.org>
Packit 42cdad
Packit 42cdad
=head1 COPYRIGHT AND LICENSE
Packit 42cdad
Packit 42cdad
This software is Copyright (c) 2012 - 2017 by Dave Rolsky.
Packit 42cdad
Packit 42cdad
This is free software, licensed under:
Packit 42cdad
Packit 42cdad
  The Artistic License 2.0 (GPL Compatible)
Packit 42cdad
Packit 42cdad
The full text of the license can be found in the
Packit 42cdad
F<LICENSE> file included with this distribution.
Packit 42cdad
Packit 42cdad
=cut