On Tue, May 03, 2011 at 01:59:33PM -0700, Ben Tilly wrote:
> 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.

See http://rt.cpan.org/Public/Bug/Display.html?id=51561. This will
hopefully be fixed soon (maybe by 2.02?), but for right now, you have to
write your own init_meta method if you're doing "also => ['Moose']".

-doy

Reply via email to