So, Ovid has a new Moose related post on his use.perl journal (http://use.perl.org/~Ovid/journal/38809 ) which sparked a discussion on #moose IRC channel.

The core of Ovid's issue is that when a role is composed into a class, the class wins in any method conflicts. This is how roles were originally specced in the traits paper and how they have always worked (at least every time I wrote them). However Ovid makes a good point that in overriding the role method "silently" it can make for some very hard to debugging.

So, while I am not willing to change this behavior, I am willing to add a warning so that it is not so "silent" anymore. So code like this will warn you that your overriding a class method.

  package Foo::Role;
  use Moose::Role;

  sub foo { ... }

  package Foo::Class;
  use Moose;

  with 'Foo::Role';

  sub foo { ... }

You will be able to silence this warning by explicitly excluding the method from the role, like so:

  package Foo::Role;
  use Moose::Role;

  sub foo { ... }

  package Foo::Class;
  use Moose;

with 'Foo::Role' => { excludes => 'foo' }; # excludes => [ 'foo' ] also works if you have more then one method

  sub foo { ... }

This should not only help with debugging, but also in refactoring because it will be able to catch possibly unintended issues before they become problems. This change is 100% backwards compat, but if you don't want warnings you will have to be more explicit.

Any comments, questions, issues?

- Stevan

Reply via email to