I have a first pass attempt at "with Some::Role => { includes => \...@methods 
}" at:

  http://github.com/Ovid/moose/tree/master

 
There are a few issues here and I didn't want to go much further without some 
direction.

First, we have a few nasty variations of this:

  Moose::Meta::Role::Application::ToInstance->new($self, $other, 
@args)->apply($self, $other);

I needed to pass the $self and $other metaclasses to the constructor to ensure 
I had proper names for error reporting.  I thought to make them instance data 
because this is happening in a couple of spots.  That would collapse the above 
code to something similar to this:

  Moose::Meta::Role::Application::ToInstance->new($self, $other, @args)->apply;

It's still ugly as sin, though, and if someone else wants to take a gander, 
that would be great.

Second:  includes and excludes are mutually exclusive and throw an exception if 
you try to use both at the same time.  There are issues surrounding this.  What 
if your inclusion and exclusion lists are not exhaustive? What happens to the 
methods not listed?  What if they overlap? I could try to code for all of this, 
but it seemed awkward.

Third: role methods not included in 'includes' are added to the required method 
list. This allows a composition-time failure when you try to use a method a 
role provides but it wasn't defined in the class or listed in the 'includes' 
list.

Fourth: what happens in this case?

  package My::Class;
  use Moose;
  with 'Some::Role' => { includes => 'foo' };
  sub foo { ... }

You've attempted to include a method, but it won't be included because you've 
already defined it.  What's the proper behavior here?

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