On May 20, 2008, at 8:53 PM, Ricardo SIGNES wrote:
* Stevan Little <[EMAIL PROTECTED]> [2008-05-20T09:47:17]
On May 19, 2008, at 8:30 PM, Bernardo Rechea wrote:
Grr, It would be quite a learning curve before I would able to
understand
Moose well enough to even try... Do you think at least that
having class
attributes declared in roles is reasonable?
No, I don't think it is reasonable.
Class attributes are really attributes of the metaclass instance
(Dave
implements them slightly differently then that, but the effect is the
same). When a role is composed into a class, Moose will merge all the
attributes and methods defined in the role into the class. It does
not
however merge all the attributes and methods from the metarole
into the
metaclass.
This sounds, to me, like an argument from implementation, instead
of from first
principles.
Is this statement true, outside the realm of how things are
implemented:
A role, when applied to a class, affects the behavior of
instances, and only
of instances?
I don't think it is, because it may add class methods.
Well the argument *could* be made that class methods and class
attributes are different, but then you can start getting into the
"objects are the poor mans closures" stuff and this isn't
comp.lang.lisp and I really don't want to go there anyway (so instead
I just point to it as I drive by :P).
Anyway, yes, it is somewhat implementation dependent (although it is
not entirely true, cause there is no reason Dave can't add this
feature, although it would be kinda tricky), but it also theoretical
too.
A truely *pure* object system would not have classes at all, a class
would itself be just an *instance* of $Class which itself would be an
instance of $Class (http://www.iinteractive.com/moose/images/
class_mop_model.jpg). In that sense, you don't ever distinguish the
difference between class and instance data, it is just obvious that
"class" data is means instance data in the metaclass.
I try to mimic this in Class::MOP as best I can, but in order to make
it useable and not full of AUTOLOAD crack, it has to bind itself to
the Perl notion of packages, classes and blessed instances. Once I
have the ability to overload -> (*wink*) then I can abandon the
(broken) packages == classes idea and be able to implement that more
pure system I speak about above (*cough* Moose 2.0 *cough*).
Now, I know that this may be a bit of a lame argument, since Perl
is so lousy
about distinguishing class and instance methods, so I will not
insert a
dramatic sting and an "AHA!" here. I just think that it's one bit
of evidence
that roles affect class behavior as well as instance behavior.
If that's the case, class attributes should be able to be provided
by a role.
Hmm, not sure that the argument for adding a feature should be "so
that it can match the other broken features" :P
If they can't be, then I could imagine myself very soon wanting to
start using
a lot more factory objects, which would be annoying.
My personal feeling is that class level data and methods are bad, and
that they should generally be avoided in a design. Quite often a
Singleton or even just a regular old instance will be enough to
replace that need. Of course, this is *my* approach and TIMTOWTDI so
feel free to ignore.
As for the "can this be done", yes it can, but currently we do not
have an easy way to hook into role composition to add features like
this into roles. This feature is on the TODO list (nothingmuch wanted
it recently for something), so we could use this as the impetus to
get this started (although tuits are somewhat in short supply for
nothingmuch and I because of $work).
- Stevan