On 28 March 2013 17:45, Jesse Luehrs <d...@tozt.net> wrote: > On Thu, Mar 28, 2013 at 05:42:18PM +0000, Piers Cawley wrote: >> On 28 March 2013 17:36, Piers Cawley <pdcaw...@bofh.org.uk> wrote: >> > On 28 March 2013 16:41, Jesse Luehrs <d...@tozt.net> wrote: >> >> On Thu, Mar 28, 2013 at 09:20:55AM -0700, Ovid wrote: >> >>> Ouch! You're right. My apologies for the confusion. The examples should >> >>> be this: >> >>> >> >>> use 5.01000; >> >>> { package a; use Moose::Role; sub result { 'a' } } >> >>> { package b; use Moose::Role; } >> >>> { package c; use Moose::Role; with qw(a b); sub result { 'c' } } >> >>> { package d; use Moose::Role; with qw(c); } >> >>> { >> >>> package Consumer; use Moose; >> >>> with 'd'; >> >>> } >> >>> say Consumer->new->result; >> >>> >> >>> Versus: >> >>> >> >>> use 5.01000; >> >>> { package a; use Moose::Role; with qw(b c); sub result { 'a' } } >> >>> { package b; use Moose::Role; } >> >>> { package c; use Moose::Role; sub result { 'c' } } >> >>> { package d; use Moose::Role; with qw(a); } >> >>> { >> >>> package Consumer; use Moose; >> >>> with 'd'; >> >>> } >> >>> say Consumer->new->result; >> >>> >> >>> Only the order of role consumption is changed, but the behavior is now >> >>> different. >> >> >> >> I can't really agree here that "only the order of role consumption is >> >> changed". I certainly wouldn't have the expectation that those two code >> >> snippets would necessarily produce the same result. The reason for this >> >> change is to bring role composition in roles into line with how role >> >> composition in classes works. For instance, here: >> >> >> >> package a; use Moose::Role; sub result { 'a' } >> >> package b; use Moose; sub result { 'b' } >> >> >> >> This has always worked without error. On the other hand, this: >> >> >> >> package a; use Moose::Role; sub result { 'a' } >> >> package b; use Moose::Role; sub result { 'b' } >> >> >> >> has historically been a conflict error, and one that has bit me (and >> >> several other people) on several occasions. I have never meant anything >> >> other than the behavior that happens in the class case, so I don't see >> >> why extending that behavior to the role case is a problem. (Or is it >> >> your opinion that the first snippet there should also be a conflict?) >> >> >> >> In general, I can't really understand why the behavior for roles and >> >> classes should be different in this sense. A role consuming another role >> >> is a different operation from role summation, and one that I think >> >> should behave more similarly to a class consuming a role. Note that this >> >> is still a conflict: >> >> >> >> { package a; use Moose::Role; sub result { 'a' } } >> >> { package b; use Moose::Role; } >> >> { package c; use Moose::Role; sub result { 'c' } } >> >> { package d; use Moose::Role; with qw(a b c); } >> >> >> >> The other benefit here is that with this change, alias and excludes >> >> become completely unnecessary, and can hopefully be deprecated. >> > >> > Whoah! What? So when I want to compose, say a and b and write my own >> > 'result' which will combine a's result and b's result, what am I >> > supposed to do? >> > >> > I'd always been under the impression that when I do: >> > >> > with qw(a b);\ >> > >> > I'm expressing the expectation that there are no conflicts between >> > those two roles and I want an (ideally compile time) error if they do >> > conflict, and I can get in and fix it through judicious use of >> > excludes (and possibly an alias or two). >> > >> > If I want the order of composition to matter, then I can do >> > >> > with 'a'; >> > with 'b'; >> > >> > For the life of me I can't see how this change can be called a good idea. >> > >> >> If what you're after here is a way to disallow all forms of silent >> >> method overriding, I think this is better done in an extension (since it >> >> would have to catch conflicts in inheritance situations as well anyway). >> > >> > That's certainly not what I'm after. But I do want to retain the >> > difference between 'with qw(a b)' and 'with q(a); with q(b);' thank >> > you very much. >> > >> > Who cooked up this idea? >> >> To clarify: I'm all for having this: >> >> package a; use Moose::Role; sub result { 'a' }; >> package b; use Moose::Role; with 'a'; sub result { 'b' } >> >> work without throwing any warnings, but if that comes at the expense of: >> >> package a; use Moose::Role; sub result { 'a' }; >> package b; use Moose::Role; sub result { 'b' }; >> package c; use Moose; with qw(a b); > > No, this is still a conflict. Role composition and role summation are > two separate processes.
Ah. Fair enough. Misunderstanding Ovid's original code sample.