X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FMouse%2FUtil%2FTypeConstraints.pm;h=f4d3c649e9d441a8d63a40b7fb34c9b071eaeea6;hb=d58887328353bfd216406ff7d686b5a4877d1731;hp=68ade3df6b3898260594c9df9a1f0979a4781672;hpb=ca980dc4f492df68e6536c0c83a2d520adc43066;p=gitmo%2FMouse.git diff --git a/lib/Mouse/Util/TypeConstraints.pm b/lib/Mouse/Util/TypeConstraints.pm index 68ade3d..f4d3c64 100644 --- a/lib/Mouse/Util/TypeConstraints.pm +++ b/lib/Mouse/Util/TypeConstraints.pm @@ -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{ @@ -367,6 +377,16 @@ sub find_type_constraint { 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); @@ -406,7 +426,7 @@ Mouse::Util::TypeConstraints - Type constraint system for Mouse =head1 VERSION -This document describes Mouse version 0.55 +This document describes Mouse version 0.68 =head2 SYNOPSIS