bump version to 1.25
[gitmo/Moose.git] / lib / Moose / Meta / TypeConstraint.pm
index 0a5f76e..bd7b4ab 100644 (file)
@@ -5,7 +5,9 @@ use strict;
 use warnings;
 use metaclass;
 
-use overload '""'     => sub { shift->name },   # stringify to tc name
+use overload '0+'     => sub { refaddr(shift) }, # id an object
+             '""'     => sub { shift->name },   # stringify to tc name
+             bool     => sub { 1 },
              fallback => 1;
 
 use Scalar::Util qw(blessed refaddr);
@@ -13,7 +15,7 @@ use Sub::Name qw(subname);
 
 use base qw(Class::MOP::Object);
 
-our $VERSION   = '1.01';
+our $VERSION   = '1.25';
 $VERSION = eval $VERSION;
 our $AUTHORITY = 'cpan:STEVAN';
 
@@ -88,6 +90,25 @@ sub coerce {
     return $coercion->coerce(@_);
 }
 
+sub assert_coerce {
+    my $self = shift;
+
+    my $coercion = $self->coercion;
+
+    unless ($coercion) {
+        require Moose;
+        Moose->throw_error("Cannot coerce without a type coercion");
+    }
+
+    return $_[0] if $self->check($_[0]);
+
+    my $result = $coercion->coerce(@_);
+
+    $self->assert_valid($result);
+
+    return $result;
+}
+
 sub check {
     my ($self, @args) = @_;
     my $constraint_subref = $self->_compiled_type_constraint;
@@ -122,7 +143,7 @@ sub get_message {
     }
     else {
         $value = (defined $value ? overload::StrVal($value) : 'undef');
-        return "Validation failed for '" . $self->name . "' failed with value $value";
+        return "Validation failed for '" . $self->name . "' with value $value";
     }
 }
 
@@ -133,7 +154,7 @@ sub equals {
 
     my $other = Moose::Util::TypeConstraints::find_type_constraint($type_or_name) or return;
 
-    return 1 if refaddr($self) == refaddr($other);
+    return 1 if $self == $other;
 
     if ( $self->has_hand_optimized_type_constraint and $other->has_hand_optimized_type_constraint ) {
         return 1 if $self->hand_optimized_type_constraint == $other->hand_optimized_type_constraint;
@@ -148,7 +169,7 @@ sub equals {
         return if $other->has_parent;
     }
 
-    return 1;
+    return;
 }
 
 sub is_a_type_of {
@@ -381,9 +402,17 @@ C<equals> and C<is_subtype_of>.
 
 =item B<< $constraint->coerce($value) >>
 
-This will attempt to coerce the value to the type. If the type does
+This will attempt to coerce the value to the type. If the type does not
 have any defined coercions this will throw an error.
 
+If no coercion can produce a value matching C<$constraint>, the original
+value is returned.
+
+=item B<< $constraint->assert_coerce($value) >>
+
+This method behaves just like C<coerce>, but if the result is not valid
+according to C<$constraint>, an error is thrown.
+
 =item B<< $constraint->check($value) >>
 
 Returns true if the given value passes the constraint for the type.