I've been thinking more about this bug: 
https://rt.cpan.org/Ticket/Display.html?id=45591

 

  #!/usr/bin/env perl

  package My::Role::Foo;
  use Moose::Role;
  sub foo { 'foo' }

  package My::Class;
  use Moose;
  with 'My::Role::Foo' => { excludes => ['foo'] };

  print My::Class->foo;

The error message is:

  Can't locate object method "foo" via package "My::Class" at role.pl line 12.

The problem that since My::Class->meta->does('My::Role::Foo'), there's a 
promise that it will provide the &foo method.  However, the failure happens at 
runtime, not at composition time.  I'm expecting a composition-time error 
message like this:

  My::Role::Foo' requires the method 'foo' to be implemented by 'My::Class' at 
...

I think I misdiagnosed the fix.  I think a better fix for this is ensuring 
every method a role provides is added to the 'requires' list.  Just added 
"requires qw(foo);" to the above code makes it work as expected.  However, I 
can't quite figure out how to make this work. I've tried several approaches 
(most interesting has been hooking into 'with'), but 
&Moose::Meta::Role::Application::apply has some interesting sequencing issues 
which was causing a couple of test failures.

Thoughts?

Cheers,
Ovid
--
Buy the book         - http://www.oreilly.com/catalog/perlhks/
Tech blog            - http://use.perl.org/~Ovid/journal/
Twitter              - http://twitter.com/OvidPerl
Official Perl 6 Wiki - http://www.perlfoundation.org/perl6

Reply via email to