X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FMouse%2FMeta%2FTypeConstraint.pm;h=182ee88166f732db2ca8d98143b17ee9be1a111c;hb=720fe8f5274bb84f5e3c843ce401d9995548786e;hp=df04f7818835f0f9f0168377ff14a0750b1d176d;hpb=3a29a0808d2822d99f28906e64502ffbd9c1cb06;p=gitmo%2FMouse.git diff --git a/lib/Mouse/Meta/TypeConstraint.pm b/lib/Mouse/Meta/TypeConstraint.pm index df04f78..182ee88 100644 --- a/lib/Mouse/Meta/TypeConstraint.pm +++ b/lib/Mouse/Meta/TypeConstraint.pm @@ -8,14 +8,30 @@ sub new { $args{name} = '__ANON__' if !defined $args{name}; - my $check = delete $args{optimized}; + if($args{parent}) { + %args = (%{$args{parent}}, %args); + # a child type must not inherit 'compiled_type_constraint' + # and 'hand_optimized_type_constraint' from the parent + delete $args{compiled_type_constraint}; + delete $args{hand_optimized_type_constraint}; + } + + my $check; - if($check){ + if($check = delete $args{optimized}) { $args{hand_optimized_type_constraint} = $check; $args{compiled_type_constraint} = $check; } - - $check = $args{constraint}; + elsif(my $param = $args{type_parameter}) { + my $generator = $args{constraint_generator} + || $class->throw_error("The $args{name} constraint cannot be used," + . " because $param doesn't subtype from a parameterizable type"); + # it must be 'constraint' + $check = $args{constraint} = $generator->($param); + } + else { + $check = $args{constraint}; + } if(defined($check) && ref($check) ne 'CODE'){ $class->throw_error( @@ -24,27 +40,19 @@ sub new { my $self = bless \%args, $class; $self->compile_type_constraint() - if !$self->{hand_optimized_type_constraint}; + if !$args{hand_optimized_type_constraint}; - $self->_compile_union_type_coercion() if $self->{type_constraints}; + if($args{type_constraints}) { + $self->_compile_union_type_coercion(); + } return $self; } sub create_child_type{ my $self = shift; return ref($self)->new( - # a child inherits its parent's attributes - %{$self}, - - # but does not inherit 'compiled_type_constraint' - # and 'hand_optimized_type_constraint' - compiled_type_constraint => undef, - hand_optimized_type_constraint => undef, - - # and is given child-specific args, of course. @_, - - # and its parent + # and inherits other attributes from the parent parent => $self, ); } @@ -201,16 +209,10 @@ sub parameterize{ } $name ||= sprintf '%s[%s]', $self->name, $param->name; - - my $generator = $self->{constraint_generator} - || $self->throw_error("The $name constraint cannot be used," - . " because $param doesn't subtype from a parameterizable type"); - return Mouse::Meta::TypeConstraint->new( name => $name, parent => $self, type_parameter => $param, - constraint => $generator->($param), # must be 'constraint', not 'optimized' ); } @@ -234,11 +236,6 @@ sub _unite { # overload infix:<|> ); } -sub throw_error { - require Mouse::Meta::Module; - goto &Mouse::Meta::Module::throw_error; -} - 1; __END__ @@ -248,7 +245,7 @@ Mouse::Meta::TypeConstraint - The Mouse Type Constraint metaclass =head1 VERSION -This document describes Mouse version 0.70 +This document describes Mouse version 0.71 =head1 DESCRIPTION @@ -259,7 +256,7 @@ constraints =head1 METHODS -=over +=over =item C<< Mouse::Meta::TypeConstraint->new(%options) >>