X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FMoose%2FMeta%2FTypeConstraint%2FUnion.pm;h=9cf67865a2f0196f10de14348a8c05d6f4e0d95e;hb=82750a8aa67b0f6cd139537bef64162d7a7c4d52;hp=0f538e3059a55ba6e87ac7a9a50d86e60f159496;hpb=aed8776196d14fe1376f14b02f450f6a4f483771;p=gitmo%2FMoose.git diff --git a/lib/Moose/Meta/TypeConstraint/Union.pm b/lib/Moose/Meta/TypeConstraint/Union.pm index 0f538e3..9cf6786 100644 --- a/lib/Moose/Meta/TypeConstraint/Union.pm +++ b/lib/Moose/Meta/TypeConstraint/Union.pm @@ -7,7 +7,8 @@ use metaclass; use Moose::Meta::TypeCoercion::Union; -our $VERSION = '0.06'; +our $VERSION = '0.62_01'; +$VERSION = eval $VERSION; our $AUTHORITY = 'cpan:STEVAN'; use base 'Moose::Meta::TypeConstraint'; @@ -20,7 +21,8 @@ __PACKAGE__->meta->add_attribute('type_constraints' => ( sub new { my ($class, %options) = @_; my $self = $class->SUPER::new( - name => (join ' | ' => map { $_->name } @{$options{type_constraints}}), + name => (join '|' => sort {$a cmp $b} + map { $_->name } @{$options{type_constraints}}), parent => undef, message => undef, hand_optimized_type_constraint => undef, @@ -40,6 +42,36 @@ sub new { return $self; } +sub equals { + my ( $self, $type_or_name ) = @_; + + my $other = Moose::Util::TypeConstraints::find_type_constraint($type_or_name); + + return unless $other->isa(__PACKAGE__); + + my @self_constraints = @{ $self->type_constraints }; + my @other_constraints = @{ $other->type_constraints }; + + return unless @self_constraints == @other_constraints; + + # FIXME presort type constraints for efficiency? + constraint: foreach my $constraint ( @self_constraints ) { + for ( my $i = 0; $i < @other_constraints; $i++ ) { + if ( $constraint->equals($other_constraints[$i]) ) { + splice @other_constraints, $i, 1; + next constraint; + } + } + } + + return @other_constraints == 0; +} + +sub parents { + my $self = shift; + $self->type_constraints; +} + sub validate { my ($self, $value) = @_; my $message; @@ -68,6 +100,29 @@ sub is_subtype_of { return 0; } +sub create_child_type { + my ( $self, %opts ) = @_; + + my $constraint + = Moose::Meta::TypeConstraint->new( %opts, parent => $self ); + + # if we have a type constraint union, and no + # type check, this means we are just aliasing + # the union constraint, which means we need to + # handle this differently. + # - SL + if ( not( defined $opts{constraint} ) + && $self->has_coercion ) { + $constraint->coercion( + Moose::Meta::TypeCoercion::Union->new( + type_constraint => $self, + ) + ); + } + + return $constraint; +} + 1; __END__ @@ -81,7 +136,7 @@ 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). +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. @@ -101,10 +156,14 @@ but it does provide the same API =item B +=item B + =item B =item B +=item B + =back =head2 Overriden methods @@ -146,6 +205,8 @@ anyway. They are here for completeness. =item B +=item B + =back =head1 BUGS