1 package MooseX::Meta::TypeConstraint::Structured::Positional;
4 use Moose::Meta::TypeConstraint ();
6 extends 'Moose::Meta::TypeConstraint';
7 with 'MooseX::Meta::TypeConstraint::Role::Structured';
11 MooseX::Meta::TypeConstraint::Structured::Positional - Structured Type Constraints
15 The follow is example usage:
17 use Moose::Util::TypeConstraints;
18 use MooseX::Meta::TypeConstraint::Structured::Positional;
20 my @required = ('Str', 'Int');
21 my @optional = ('Object');
23 my $tc = MooseX::Meta::TypeConstraint::Structured::Positional->new(
25 parent => find_type_constraint('ArrayRef'),
27 find_type_constraint($_);
29 optional_signature => [map {
30 find_type_constraint($_);
36 Positionally structured Constraints expect the internal constraints to be in
37 'positioned' or ArrayRef style order. This allows you to add type constraints
38 to the internal values of the Arrayref.
42 This class defines the following attributes.
46 This is a signature of internal contraints for the contents of the outer
51 has '+signature' => (isa=>'ArrayRef[Moose::Meta::TypeConstraint]');
53 =head2 optional_signature
55 This is a signature of internal contraints for the contents of the outer
56 contraint container. These are optional constraints.
60 has '+optional_signature' => (isa=>'ArrayRef[Moose::Meta::TypeConstraint]');
64 This class defines the following methods.
66 =head2 _normalize_args
68 Get arguments into a known state or die trying. Ideally we try to make this
69 into a HashRef so we can match it up with the L</signature> HashRef.
74 my ($self, $args) = @_;
76 if(ref $args eq 'ARRAY') {
79 confess 'Signature must be an ArrayRef type';
82 confess 'Signature cannot be empty';
88 The constraint is basically validating the L</signature> against the incoming
95 my @args = $self->_normalize_args(shift);
96 my @signature = @{$self->signature};
97 my @optional_signature = @{$self->optional_signature}
98 if $self->has_optional_signature;
100 ## First make sure all the required type constraints match
101 while( my $type_constraint = shift @signature) {
102 if(my $error = $type_constraint->validate(shift @args)) {
107 ## Now test the option type constraints.
108 while( my $arg = shift @args) {
109 if(my $optional_type_constraint = shift @optional_signature) {
110 if(my $error = $optional_type_constraint->validate($arg)) {
114 confess "Too Many arguments for the available type constraints";
118 ## If we got this far we passed!
123 =head2 signature_equals
125 Check that the signature equals another signature.
129 sub signature_equals {
130 my ($self, $compared_type_constraint) = @_;
132 foreach my $idx (0..$#{$self->signature}) {
133 my $this = $self->signature->[$idx];
134 my $that = $compared_type_constraint->signature->[$idx];
135 return unless $this->equals($that);
138 if($self->has_optional_signature) {
139 foreach my $idx (0..$#{$self->optional_signature}) {
140 my $this = $self->optional_signature->[$idx];
141 my $that = $compared_type_constraint->optional_signature->[$idx];
142 return unless $this->equals($that);
151 John James Napiorkowski <jjnapiork@cpan.org>
155 You may distribute this code under the same terms as Perl itself.