bump version to 0.65
[gitmo/Moose.git] / lib / Moose / Meta / TypeConstraint / Parameterizable.pm
index 9318bce..e12ada3 100644 (file)
@@ -4,10 +4,13 @@ use strict;
 use warnings;
 use metaclass;
 
-our $VERSION   = '0.53';
+our $VERSION   = '0.65';
+$VERSION = eval $VERSION;
 our $AUTHORITY = 'cpan:STEVAN';
 
 use base 'Moose::Meta::TypeConstraint';
+use Moose::Meta::TypeConstraint::Parameterized;
+use Moose::Util::TypeConstraints ();
 
 __PACKAGE__->meta->add_attribute('constraint_generator' => (
     accessor  => 'constraint_generator',
@@ -39,6 +42,39 @@ sub _can_coerce_constraint_from {
     };
 }
 
+sub _parse_type_parameter {
+    my ($self, $type_parameter) = @_;
+    return Moose::Util::TypeConstraints::find_or_create_isa_type_constraint($type_parameter);
+}
+
+sub parameterize {
+    my ($self, $type_parameter) = @_;
+
+    my $contained_tc = $self->_parse_type_parameter($type_parameter);
+    
+    ## The type parameter should be a subtype of the parent's type parameter
+    ## if there is one.
+    
+    if(my $parent = $self->parent) {
+        if($parent->can('type_parameter')) {
+            $contained_tc->is_a_type_of($parent->type_parameter)
+             || Moose->throw_error("$type_parameter is not a subtype of ".$parent->type_parameter);
+        }
+    }
+
+    if ( $contained_tc->isa('Moose::Meta::TypeConstraint') ) {
+        my $tc_name = $self->name . '[' . $contained_tc->name . ']';
+        return Moose::Meta::TypeConstraint::Parameterized->new(
+            name           => $tc_name,
+            parent         => $self,
+            type_parameter => $contained_tc,
+        );
+    }
+    else {
+        Moose->throw_error("The type parameter must be a Moose meta type");
+    }
+}
+
 
 1;
 
@@ -61,6 +97,11 @@ Moose::Meta::TypeConstraint::Parameterizable - Higher Order type constraints for
 
 =item B<generate_constraint_for>
 
+=item B<parameterize>
+
+Given a single type constraint or type constraint string, this method
+parameterizes the type based on the given argument.
+
 =item B<meta>
 
 =back