1 package Moo::HandleMoose;
6 sub import { inject_all() }
10 inject_fake_metaclass_for($_) for grep $_ ne 'Moo::Object', keys %Moo::MAKERS;
11 inject_fake_metaclass_for($_) for keys %Moo::Role::INFO;
14 sub inject_fake_metaclass_for {
17 Class::MOP::store_metaclass_by_name(
18 $name, bless({ name => $name }, 'Moo::HandleMoose::FakeMetaClass')
24 sub inject_real_metaclass_for {
26 return Class::MOP::get_metaclass_by_name($name) if $DID_INJECT{$name};
27 require Moose; require Moo; require Moo::Role;
28 Class::MOP::remove_metaclass_by_name($name);
29 my ($am_role, $meta, $attr_specs) = do {
30 if (my $info = $Moo::Role::INFO{$name}) {
31 (1, Moose::Meta::Role->initialize($name), $info->{attributes})
33 my $specs = Moo->_constructor_maker_for($name)->all_attribute_specs;
34 (0, Moose::Meta::Class->initialize($name), $specs);
37 my %methods = %{Role::Tiny->_concrete_methods_of($name)};
40 local @{_getstash($name)}{keys %methods};
41 foreach my $name (keys %$attr_specs) {
42 push @attrs, $meta->add_attribute($name => %{$attr_specs->{$name}});
46 foreach my $attr (@attrs) {
47 foreach my $method (@{$attr->associated_methods}) {
48 $method->{body} = $name->can($method->name);
52 $DID_INJECT{$name} = 1;
57 package Moo::HandleMoose::FakeMetaClass;
62 my ($meth) = (our $AUTOLOAD =~ /([^:]+)$/);
63 Moo::HandleMoose::inject_real_metaclass_for((shift)->{name})->$meth(@_)
66 Moo::HandleMoose::inject_real_metaclass_for((shift)->{name})->can(@_)
69 Moo::HandleMoose::inject_real_metaclass_for((shift)->{name})->isa(@_)