X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FMouse%2FUtil%2FTypeConstraints.pm;h=b52a99497adb677e05121e9e3ae39e15bcae441a;hb=43c1bb1ad8ebe5534248ddc761a9bbbc95044643;hp=225cefe626b3c5c2acd0771de1dc8261e708b02b;hpb=a4b15169d428989d2e901708effe21f3eaab23b5;p=gitmo%2FMouse.git diff --git a/lib/Mouse/Util/TypeConstraints.pm b/lib/Mouse/Util/TypeConstraints.pm index 225cefe..b52a994 100644 --- a/lib/Mouse/Util/TypeConstraints.pm +++ b/lib/Mouse/Util/TypeConstraints.pm @@ -1,5 +1,5 @@ package Mouse::Util::TypeConstraints; -use Mouse::Util qw(does_role not_supported); # enables strict and warnings +use Mouse::Util; # enables strict and warnings use Carp (); use Scalar::Util (); @@ -17,6 +17,7 @@ Mouse::Exporter->setup_import_methods( coerce find_type_constraint + register_type_constraint )], ); @@ -149,9 +150,18 @@ sub _create_type{ if($TYPE{$name}){ my $that = $TYPE{$name}->{package_defined_in} || __PACKAGE__; - ($this eq $that) or Carp::croak( - "The type constraint '$name' has already been created in $that and cannot be created again in $this" - ); + if($this ne $that) { + my $note = ''; + if($that eq __PACKAGE__) { + $note = sprintf " ('%s' is %s type constraint)", + $name, + scalar(grep { $name eq $_ } list_all_builtin_type_constraints()) + ? 'a builtin' + : 'an implicitly created'; + } + Carp::croak("The type constraint '$name' has already been created in $that" + . " and cannot be created again in $this" . $note); + } } } else{ @@ -213,7 +223,10 @@ sub role_type { # RoleType return _create_type 'subtype', $name => ( as => 'Object', - optimized_as => sub { Scalar::Util::blessed($_[0]) && does_role($_[0], $role) }, + optimized_as => sub { + return Scalar::Util::blessed($_[0]) + && Mouse::Util::does_role($_[0], $role); + }, ); } @@ -240,12 +253,15 @@ sub enum { $name = shift; } - %valid = map{ $_ => undef } (@_ == 1 && ref($_[0]) eq 'ARRAY' ? @{$_[0]} : @_); + %valid = map{ $_ => undef } + (@_ == 1 && ref($_[0]) eq 'ARRAY' ? @{$_[0]} : @_); # EnumType return _create_type 'subtype', $name => ( as => 'Str', - optimized_as => sub{ defined($_[0]) && !ref($_[0]) && exists $valid{$_[0]} }, + optimized_as => sub{ + return defined($_[0]) && !ref($_[0]) && exists $valid{$_[0]}; + }, ); } @@ -360,17 +376,25 @@ sub _parse_type { sub find_type_constraint { my($spec) = @_; - return $spec if Mouse::Util::is_a_type_constraint($spec); - return undef if !defined $spec; + return $spec if Mouse::Util::is_a_type_constraint($spec) or not defined $spec; $spec =~ s/\s+//g; return $TYPE{$spec}; } +sub register_type_constraint { + my($constraint) = @_; + Carp::croak("No type supplied / type is not a valid type constraint") + unless Mouse::Util::is_a_type_constraint($constraint); + my $name = $constraint->name; + Carp::croak("can't register an unnamed type constraint") + unless defined $name; + return $TYPE{$name} = $constraint; +} + sub find_or_parse_type_constraint { my($spec) = @_; - return $spec if Mouse::Util::is_a_type_constraint($spec); - return undef if !defined $spec; + return $spec if Mouse::Util::is_a_type_constraint($spec) or not defined $spec; $spec =~ s/\s+//g; return $TYPE{$spec} || do{ @@ -406,7 +430,7 @@ Mouse::Util::TypeConstraints - Type constraint system for Mouse =head1 VERSION -This document describes Mouse version 0.50_08 +This document describes Mouse version 0.71 =head2 SYNOPSIS