Dave,
I will review this sometime over the holidays, but it sounds sane and
my only real concern is the breaking of back-compat. I think we need
to make 100% sure we know what we are breaking and where, if it is
only role attribute introspection I suspect we are okay, but a change
this fundamental could have deeper impacts. I think we should run the
biggest smolder test possible to make sure we are not breaking
assumptions.
- Stevan
On Dec 20, 2009, at 2:40 PM, Dave Rolsky wrote:
There are two branches for this, one for CMOP and one for Moose.
The CMOP branch is called topic/mi-methods-attributes. The "mi"
refers to multiple inheritance. What I've done is pull out "having
methods" and "having attributes" into two base clasess,
CMOP::HasMethods and ::HasAttributes.
I know we talked about some sort of role-like system for this, but
MI works just as well for this particular usage, and getting role-
like things working in CMOP was proving _very_ difficult because of
bootstrapping issues.
The ::HasMethods class is a parent for ::Package. Since
Moose::Meta::Role already inherits from ::Package, this just works.
The ::HasAttributes class is a parent for ::Class.
In the Moose branch topic/roles-have-real-attributes I've made
Moose::Meta::Role also inherit from CMOP::HasAttributes.
When an attribute is added to a role, it gets an additional trait
added to it, Moose::Meta::Attribute::Trait::InRole. An attribute in
a role does not generate any methods (yet?).
This ::InRole trait also wraps the clone method to _remove_ itself
as a trait when the attribute is cloned. In other words, cloning an
attribute with the ::InRole trait returns a new attribute without
that trait.
As you might guess, when a role is applied to a _class_, the role's
attributes are cloned and added to the class. The class ultimately
ends up with a copy of the attribute minus the ::InRole trait.
All the tests pass, and I really had to change very little there. I
had to change a bunch of the self-introspection related tests in
CMOP, of course. Other than that, most test changes were simply to
account for the fact that roles now have real attributes, so
introspecting these attributes is done differently.
This _will_ break backwards compat for anything that did
introspection on role attributes. I haven't looked for breakage yet.
For now, I'd appreciate a review of the design and concepts. If it's
acceptable, I'll add docs, fix breakage it causes in MX modules, and
so on.
-dave
/*============================================================
http://VegGuide.org http://blog.urth.org
Your guide to all that's veg House Absolute(ly Pointless)
============================================================*/