A nice fix. http://code.google.com/p/pharo/issues/detail?id=246&colspec=ID%20Type%20Stat...
The discussion on squeakdev was interesting.
Stef
Begin forwarded message:
From: "Eliot Miranda" <eliot.miranda@gmail.com> Date: October 13, 2008 9:43:15 PM CEDT To: "The general-purpose Squeak developers list" <squeak-dev@lists.squeakfoundation.org
Subject: Re: [squeak-dev] re: About classVariables Reply-To: The general-purpose Squeak developers list <squeak-dev@lists.squeakfoundation.org
On Mon, Oct 13, 2008 at 2:02 AM, Martin Beck <martin.beck@hpi.uni-potsdam.de
wrote: Craig Latta wrote:
Hi Stef--
To my stupefaction I discovered that the classVariables of a class are not the same as the ones of its metaclass.
TheRoot classVarNames ~= TheRoot class classVarNames
Does any body have some ideas why this is like that? For me this is a conceptual bug.
Actually, metaclasses don't really have class variables at all. Class variables are defined by Class, which is a sibling of Metaclass, not a superclass. There's a method in Behavior which just answers a new empty Set for classVarNames; this is what you're invoking when you evaluate [TheRoot class classVarNames].
However,
TheRoot classPool = TheRoot class classPool
evaluates to true...
Regards, Martin
One fix is to add the following method: ------------8<----------- !Metaclass methodsFor: 'class variables' stamp: 'eem 10/13/2008 12:37'! classVarNames "Answer a Set of the names of the class variables defined in the receiver's instance."
^thisClass classVarNames! ! ------------8<----------- c.f. Metaclass>>classPool.
But a better fix is to move Class>>classVarNames to ClassDescription: ------------8<----------- 'From Croquet1.0beta of 11 April 2006 [latest update: #1] on 13 October 2008 at 12:41:36 pm'!
!ClassDescription methodsFor: 'class variables' stamp: 'eem 10/13/2008 12:41'! classVarNames "Answer a Set of the names of the class variables defined in the receiver."
^self classPool keys! !
Class removeSelector: #classVarNames! ------------8<-----------
Whoever said that the class variables of a metaclass should be those of Metaclass is very wrong. Code compiled in the context of a metaclass includes the class variables of the non-metaclass (metaclass's instance), otherwise one couldn't access class variables in class-side methods.