package Error::TypeTiny::Assertion; use 5.006001; use strict; use warnings; BEGIN { if ($] < 5.008) { require Devel::TypeTiny::Perl56Compat }; } BEGIN { $Error::TypeTiny::Assertion::AUTHORITY = 'cpan:TOBYINK'; $Error::TypeTiny::Assertion::VERSION = '1.004004'; } require Error::TypeTiny; our @ISA = 'Error::TypeTiny'; sub type { $_[0]{type} }; sub value { $_[0]{value} }; sub varname { $_[0]{varname} ||= '$_' }; sub attribute_step { $_[0]{attribute_step} }; sub attribute_name { $_[0]{attribute_name} }; sub has_type { defined $_[0]{type} }; # sic sub has_attribute_step { exists $_[0]{attribute_step} }; sub has_attribute_name { exists $_[0]{attribute_name} }; sub new { my $class = shift; my $self = $class->SUPER::new(@_); if (ref $Method::Generate::Accessor::CurrentAttribute) { require B; my %d = %{$Method::Generate::Accessor::CurrentAttribute}; $self->{attribute_name} = $d{name} if defined $d{name}; $self->{attribute_step} = $d{step} if defined $d{step}; if (defined $d{init_arg}) { $self->{varname} = sprintf('$args->{%s}', B::perlstring($d{init_arg})); } elsif (defined $d{name}) { $self->{varname} = sprintf('$self->{%s}', B::perlstring($d{name})); } } return $self; } sub message { my $e = shift; $e->varname eq '$_' ? $e->SUPER::message : sprintf('%s (in %s)', $e->SUPER::message, $e->varname); } sub _build_message { my $e = shift; $e->has_type ? sprintf('%s did not pass type constraint "%s"', Type::Tiny::_dd($e->value), $e->type) : sprintf('%s did not pass type constraint', Type::Tiny::_dd($e->value)) } *to_string = sub { my $e = shift; my $msg = $e->message; my $c = $e->context; $msg .= sprintf(" at %s line %s", $c->{file}||'file?', $c->{line}||'NaN') if $c; my $explain = $e->explain; return "$msg\n" unless @{ $explain || [] }; $msg .= "\n"; for my $line (@$explain) { $msg .= " $line\n"; } return $msg; } if $] >= 5.008; sub explain { my $e = shift; return undef unless $e->has_type; $e->type->validate_explain($e->value, $e->varname); } 1; __END__ =pod =encoding utf-8 =head1 NAME Error::TypeTiny::Assertion - exception when a value fails a type constraint =head1 STATUS This module is covered by the L. =head1 DESCRIPTION This exception is thrown when a value fails a type constraint assertion. This package inherits from L; see that for most documentation. Major differences are listed below: =head2 Attributes =over =item C The type constraint that was checked against. Weakened links are involved, so this may end up being C. =item C The value that was tested. =item C The name of the variable that was checked, if known. Defaults to C<< '$_' >>. =item C If this exception was thrown as the result of an isa check or a failed coercion for a Moo attribute, then this will tell you which attribute (if your Moo is new enough). (Hopefully one day this will support other OO frameworks.) =item C If this exception was thrown as the result of an isa check or a failed coercion for a Moo attribute, then this will contain either C<< "isa check" >> or C<< "coercion" >> to indicate which went wrong (if your Moo is new enough). (Hopefully one day this will support other OO frameworks.) =back =head2 Methods =over =item C, C, C Predicate methods. =item C Overridden to add C to the message if defined. =item C Attempts to explain why the value did not pass the type constraint. Returns an arrayref of strings providing step-by-step reasoning; or returns undef if no explanation is possible. =back =head1 BUGS Please report any bugs to L. =head1 SEE ALSO L. =head1 AUTHOR Toby Inkster Etobyink@cpan.orgE. =head1 COPYRIGHT AND LICENCE This software is copyright (c) 2013-2014, 2017-2019 by Toby Inkster. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =head1 DISCLAIMER OF WARRANTIES THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.