X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FMoo%2FHandleMoose.pm;h=b68d19aab56b55d11ea170252a13e854e0af429e;hb=2334229bd1dc776d160b5782f9e0c9b6c658f5d1;hp=21af12cdd445614bd0e684a64c242e5480f6e4f3;hpb=7b27f050d312c5659639ea4f71fd3a39363d9b6f;p=gitmo%2FMoo.git diff --git a/lib/Moo/HandleMoose.pm b/lib/Moo/HandleMoose.pm index 21af12c..b68d19a 100644 --- a/lib/Moo/HandleMoose.pm +++ b/lib/Moo/HandleMoose.pm @@ -37,6 +37,12 @@ sub inject_fake_metaclass_for { Class::MOP::store_metaclass_by_name( $name, bless({ name => $name }, 'Moo::HandleMoose::FakeMetaClass') ); + require Moose::Util::TypeConstraints; + if ($Moo::Role::INFO{$name}) { + Moose::Util::TypeConstraints::find_or_create_does_type_constraint($name); + } else { + Moose::Util::TypeConstraints::find_or_create_isa_type_constraint($name); + } } { @@ -69,10 +75,6 @@ sub inject_real_metaclass_for { my %methods = %{Role::Tiny->_concrete_methods_of($name)}; - while (my ($meth_name, $meth_code) = each %methods) { - $meta->add_method($meth_name, $meth_code) if $meth_code; - } - # if stuff gets added afterwards, _maybe_reset_handlemoose should # trigger the recreation of the metaclass but we need to ensure the # Role::Tiny cache is cleared so we don't confuse Moo itself. @@ -93,22 +95,24 @@ sub inject_real_metaclass_for { delete $spec{index}; $spec{is} = 'ro' if $spec{is} eq 'lazy' or $spec{is} eq 'rwp'; delete $spec{asserter}; + my $coerce = $spec{coerce}; if (my $isa = $spec{isa}) { my $tc = $spec{isa} = do { if (my $mapped = $TYPE_MAP{$isa}) { - $mapped->(); + my $type = $mapped->(); + $coerce ? $type->create_child_type(name => $type->name) : $type; } else { Moose::Meta::TypeConstraint->new( constraint => sub { eval { &$isa; 1 } } ); } }; - if (my $coerce = $spec{coerce}) { + if ($coerce) { $tc->coercion(Moose::Meta::TypeCoercion->new) ->_compiled_type_coercion($coerce); $spec{coerce} = 1; } - } elsif (my $coerce = $spec{coerce}) { + } elsif ($coerce) { my $attr = perlstring($name); my $tc = Moose::Meta::TypeConstraint->new( constraint => sub { die "This is not going to work" }, @@ -136,6 +140,11 @@ sub inject_real_metaclass_for { } } } + for my $meth_name (keys %methods) { + my $meth_code = $methods{$meth_name}; + $meta->add_method($meth_name, $meth_code) if $meth_code; + } + if ($am_role) { my $info = $Moo::Role::INFO{$name}; $meta->add_required_methods(@{$info->{requires}});