According to the documentation for Moose::Exporter I would expect the
following two modules to be equivalent:

  package TestMooseExporter;
  use Moose ();
  use Moose::Exporter;

  Moose::Exporter->setup_import_methods(
      with_meta => [qw(
          hello
      )],
      also => "Moose",
      base_class_roles => ["TestRole"],
  );

  sub hello {
      my $meta = shift;
      print "Hello, $meta->{package}\n";
  }

  1;

and

  package TestMooseExporter;
  use Moose ();
  use Moose::Exporter;
  use Moose::Util::MetaRole;

  Moose::Exporter->setup_import_methods(
      with_meta => [qw(
          hello
      )],
      also => "Moose",
  );

  sub hello {
      my $meta = shift;
      print "Hello, $meta->{package}\n";
  }

  sub init_meta {
      shift;
      my %args = @_;
      Moose->init_meta(%args);
      Moose::Util::MetaRole::apply_base_class_roles(
          for   => $args{for_class},
          roles => ['TestRole'],
      );

      return $args{for_class}->meta;
  }

  1;

But they are not.  The second forces TestRole to be applied to any
class that uses the module, and the first does not.

Looking inside of Moose::Exporter::_make_init_meta I see the following
section of code that should set up the role:

        Moose::Util::MetaRole::apply_base_class_roles(
            for_class => $options{for_class},
            %base_class_roles,
            )
            if Class::MOP::class_of( $options{for_class} )
                ->isa('Moose::Meta::Class');

I have no idea why that inline if is there, but it seems to be
preventing Moose from working like the documentation lead me to expect
it would.

Reply via email to