rollback some stuff to reset my brain a bit
[gitmo/MooseX-Types-Structured.git] / lib / MooseX / Meta / TypeConstraint / Structured / Positional.pm
index ffaae20..d29ed46 100644 (file)
@@ -2,7 +2,6 @@ package MooseX::Meta::TypeConstraint::Structured::Positional;
 
 use Moose;
 use Moose::Meta::TypeConstraint ();
-use Moose::Util::TypeConstraints;
 
 extends 'Moose::Meta::TypeConstraint';
 with 'MooseX::Meta::TypeConstraint::Role::Structured';
@@ -11,41 +10,32 @@ with 'MooseX::Meta::TypeConstraint::Role::Structured';
 
 MooseX::Meta::TypeConstraint::Structured::Positional - Structured Type Constraints
 
-=head1 VERSION
+=head1 SYNOPSIS
 
-0.01
-
-=cut
-
-our $VERSION = '0.01';
+The follow is example usage:
 
+    use Moose::Util::TypeConstraints;
+    use MooseX::Meta::TypeConstraint::Structured::Positional;
+    
+    my @required = ('Str', 'Int');
+    my @optional = ('Object');
+    
+    my $tc = MooseX::Meta::TypeConstraint::Structured::Positional->new(
+        name => 'Dict',
+        parent => find_type_constraint('ArrayRef'),
+        signature => [map {
+            find_type_constraint($_);
+        } @required],
+        optional_signature => [map {
+            find_type_constraint($_);
+        } @optional],
+    );
+    
 =head1 DESCRIPTION
 
-Structured type constraints let you assign an internal pattern of type
-constraints to a 'container' constraint.  The goal is to make it easier to
-declare constraints like "ArrayRef[Int, Int, Str]" where the constraint is an
-ArrayRef of three elements and the internal constraint on the three is Int, Int
-and Str.
-
-To accomplish this, we add an attribute to the base L<Moose::Meta::TypeConstraint>
-to hold a L</signature>, which is a reference to a pattern of type constraints.
-We then override L</constraint> to check our incoming value to the attribute
-against this signature pattern.
-
 Positionally structured Constraints expect the internal constraints to be in
-'positioned' or ArrayRef style order.
-
-=head1 TYPES
-
-The following types are defined in this class.
-
-=head2 Moose::Meta::TypeConstraint
-
-Used to make sure we can properly validate incoming signatures.
-
-=cut
-
-class_type 'Moose::Meta::TypeConstraint';
+'positioned' or ArrayRef style order.  This allows you to add type constraints
+to the internal values of the Arrayref.
 
 =head1 ATTRIBUTES
 
@@ -58,9 +48,7 @@ contraint container.
 
 =cut
 
-has '+signature' => (
-    isa=>'ArrayRef[Moose::Meta::TypeConstraint]',
-);
+has '+signature' => (isa=>'ArrayRef[Moose::Meta::TypeConstraint]');
 
 =head2 optional_signature
 
@@ -69,11 +57,7 @@ contraint container.  These are optional constraints.
 
 =cut
 
-has 'optional_signature' => (
-    is=>'ro',
-    isa=>'ArrayRef[Moose::Meta::TypeConstraint]',
-    predicate=>'has_optional_signature',
-);
+has '+optional_signature' => (isa=>'ArrayRef[Moose::Meta::TypeConstraint]');
 
 =head1 METHODS
 
@@ -110,8 +94,8 @@ sub constraint {
     return sub {
         my @args = $self->_normalize_args(shift);
         my @signature = @{$self->signature};
-        my @optional_signature = @{$self->optional_signature}
-         if $self->has_optional_signature;
+               my @optional_signature = @{$self->optional_signature}
+               if $self->has_optional_signature; 
         
         ## First make sure all the required type constraints match        
         while( my $type_constraint = shift @signature) {
@@ -122,10 +106,13 @@ sub constraint {
         
         ## Now test the option type constraints.
         while( my $arg = shift @args) {
-            my $optional_type_constraint = shift @optional_signature;
-            if(my $error = $optional_type_constraint->validate($arg)) {
-                confess $error;
-            }              
+            if(my $optional_type_constraint = shift @optional_signature) {
+                if(my $error = $optional_type_constraint->validate($arg)) {
+                    confess $error;
+                }                              
+            } else {
+                confess "Too Many arguments for the available type constraints";
+            }
         }
         
         ## If we got this far we passed!
@@ -159,28 +146,6 @@ sub signature_equals {
     return 1;
 }
 
-=head2 equals
-
-modifier to make sure equals descends into the L</signature>
-
-=cut
-
-around 'equals' => sub {
-    my ($equals, $self, $compared_type_constraint) = @_;
-    
-    ## Make sure we are comparing typeconstraints of the same base class
-    return unless $compared_type_constraint->isa(__PACKAGE__);
-    
-    ## Make sure the base equals is also good
-    return unless $self->$equals($compared_type_constraint);
-    
-    ## Make sure the signatures match
-    return unless $self->signature_equals($compared_type_constraint);
-   
-    ## If we get this far, the two are equal
-    return 1;
-};
-
 =head1 AUTHOR
 
 John James Napiorkowski <jjnapiork@cpan.org>