X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=gitmo%2FMouse.git;a=blobdiff_plain;f=lib%2FMouse%2FMeta%2FTypeConstraint.pm;h=13b44954c5042e659610816dcaf21f02d0db29fd;hp=7b584bfc74e703bc3fc16b152de8ffe176aa8a86;hb=a133bcea30632f3bdb815d5001e364675dc14028;hpb=684db121da77d6c63be5a58e33606907ca2aa4fb diff --git a/lib/Mouse/Meta/TypeConstraint.pm b/lib/Mouse/Meta/TypeConstraint.pm index 7b584bf..13b4495 100644 --- a/lib/Mouse/Meta/TypeConstraint.pm +++ b/lib/Mouse/Meta/TypeConstraint.pm @@ -1,9 +1,14 @@ package Mouse::Meta::TypeConstraint; use strict; use warnings; + use overload '""' => sub { shift->{name} }, # stringify to tc name fallback => 1; +use Carp (); + +use Mouse::Util qw(:meta); + sub new { my $class = shift; my %args = @_; @@ -14,7 +19,11 @@ sub new { $check = $check->{_compiled_type_constraint}; } - bless +{ name => $name, _compiled_type_constraint => $check }, $class; + bless +{ + name => $name, + _compiled_type_constraint => $check, + message => $args{message} + }, $class; } sub name { shift->{name} } @@ -24,12 +33,58 @@ sub check { $self->{_compiled_type_constraint}->(@_); } +sub validate { + my ($self, $value) = @_; + if ($self->{_compiled_type_constraint}->($value)) { + return undef; + } + else { + $self->get_message($value); + } +} + +sub assert_valid { + my ($self, $value) = @_; + + my $error = $self->validate($value); + return 1 if ! defined $error; + + Carp::confess($error); +} + + +sub message { + return $_[0]->{message}; +} + +sub get_message { + my ($self, $value) = @_; + if ( my $msg = $self->message ) { + local $_ = $value; + return $msg->($value); + } + else { + $value = ( defined $value ? overload::StrVal($value) : 'undef' ); + return + "Validation failed for '" + . $self->name + . "' failed with value $value"; + } +} + +sub is_a_type_of{ + my($self, $tc_name) = @_; + + return $self->name eq $tc_name + || $self->name =~ /\A $tc_name \[/xms; # "ArrayRef" =~ "ArrayRef[Foo]" +} + 1; __END__ =head1 NAME -Mouse::Meta::TypeConstraint - The Mouse Type Constraint Metaclass +Mouse::Meta::TypeConstraint - The Mouse Type Constraint metaclass =head1 DESCRIPTION @@ -51,5 +106,9 @@ Don't use this. =back +=head1 SEE ALSO + +L + =cut