X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FMoose%2FMeta%2FTypeConstraint%2FUnion.pm;h=4c3a424d90c4ab29ec46b1ff7123540856edc444;hb=74397c13ad55fc865db34721aed512d4f605fadf;hp=4b8a15c5199324f4b6a54d246f38b700b5afadee;hpb=e1737edc1aeb23724d9da1fec93ed82e900d8e00;p=gitmo%2FMoose.git diff --git a/lib/Moose/Meta/TypeConstraint/Union.pm b/lib/Moose/Meta/TypeConstraint/Union.pm index 4b8a15c..4c3a424 100644 --- a/lib/Moose/Meta/TypeConstraint/Union.pm +++ b/lib/Moose/Meta/TypeConstraint/Union.pm @@ -7,7 +7,7 @@ use metaclass; use Moose::Meta::TypeCoercion::Union; -our $VERSION = '0.62_02'; +our $VERSION = '0.75_01'; $VERSION = eval $VERSION; our $AUTHORITY = 'cpan:STEVAN'; @@ -20,21 +20,15 @@ __PACKAGE__->meta->add_attribute('type_constraints' => ( sub new { my ($class, %options) = @_; + + my $name = join '|' => sort { $a cmp $b } + map { $_->name } @{ $options{type_constraints} }; + my $self = $class->SUPER::new( - name => (join '|' => sort {$a cmp $b} - map { $_->name } @{$options{type_constraints}}), - parent => undef, - message => undef, - hand_optimized_type_constraint => undef, - compiled_type_constraint => sub { - my $value = shift; - foreach my $type (@{$options{type_constraints}}) { - return 1 if $type->check($value); - } - return undef; - }, - %options + name => $name, + %options, ); + $self->_set_constraint(sub { $self->check($_[0]) }); $self->coercion(Moose::Meta::TypeCoercion::Union->new( type_constraint => $self @@ -42,6 +36,21 @@ sub new { return $self; } +sub _actually_compile_type_constraint { + my $self = shift; + + my @constraints = @{ $self->type_constraints }; + + return sub { + my $value = shift; + foreach my $type (@constraints) { + return 1 if $type->check($value); + } + return undef; + }; +} + + sub equals { my ( $self, $type_or_name ) = @_; @@ -135,77 +144,73 @@ Moose::Meta::TypeConstraint::Union - A union of Moose type constraints =head1 DESCRIPTION -This metaclass represents a union of Moose type constraints. More -details to be explained later (possibly in a Cookbook recipe). - -This actually used to be part of Moose::Meta::TypeConstraint, but it -is now better off in it's own file. +This metaclass represents a union of type constraints. A union takes +multiple type constraints, and is true if any one of its member +constraints is true. -=head1 METHODS +=head1 INHERITANCE -This class is not a subclass of Moose::Meta::TypeConstraint, -but it does provide the same API +C is a subclass of +L. =over 4 -=item B +=item B<< Moose::Meta::TypeConstraint::Union->new(%options) >> -=item B +This creates a new class type constraint based on the given +C<%options>. -=item B +It takes the same options as its parent. It also requires an +additional option, C. This is an array reference +containing the L objects that are the +members of the union type. The C option defaults to the names +all of these member types sorted and then joined by a pipe (|). -=item B +The constructor sets the implementation of the constraint so that is +simply calls C on the newly created object. -=item B +Finally, the constructor also makes sure that the object's C +attribute is a L object. -=item B +=item B<< $constraint->type_constraints >> -=item B +This returns the array reference of C provided to +the constructor. -=item B +=item B<< $constraint->parents >> -=back - -=head2 Overriden methods - -=over 4 - -=item B - -=item B +This returns the same constraint as the C method. -=item B +=item B<< $constraint->check($value) >> -=item B +=item B<< $constraint->validate($value) >> -=item B +These two methods simply call the relevant method on each of the +member type constraints in the union. If any type accepts the value, +the value is valid. -=back - -=head2 Empty or Stub methods - -These methods tend to not be very relevant in -the context of a union. Either that or they are -just difficult to specify and not very useful -anyway. They are here for completeness. - -=over 4 +With C the error message returned includes all of the error +messages returned by the member type constraints. -=item B +=item B<< $constraint->equals($type_name_or_object) >> -=item B +A type is considered equal if it is also a union type, and the two +unions have the same member types. -=item B +=item B<< $constraint->is_a_type_of($type_name_or_object) >> -=item B +This returns true if any of the member type constraints return true +for the C method. -=item B +=item B<< $constraint->is_subtype_of >> -=item B +This returns true if any of the member type constraints return true +for the C method. -=item B +=item B<< $constraint->create_child_type(%options) >> -=item B +This returns a new L object with the type +as its parent. =back @@ -221,7 +226,7 @@ Stevan Little Estevan@iinteractive.comE =head1 COPYRIGHT AND LICENSE -Copyright 2006-2008 by Infinity Interactive, Inc. +Copyright 2006-2009 by Infinity Interactive, Inc. L