[Q] mixin pattern - how to use an alternate Behavior for Class

Rob Withers rwithers12 at mediaone.net
Sun Jan 27 23:32:24 UTC 2002


I am trying to create a mixin class which compiles it's methods 'in' the 
scope of a different class.  One way to go would be to have class side 
#compile methods which switches the class used to compile the method in.  I 
would need a classVariable to hold this contextClass and off we go.

An alternative mechanism that I am exploring, is to have a different 
subclass of ClassDescription (or Class), which has an instance method 
contextClass, and the compile methods are overridden on the instance side 
of this MixinClass.

So I have a MixinClass, which has roughly identical protocol to Class and I 
am now adding a set of methods to ClassBuilder to create this class 
(instance of MixinClass).  The problem is that I am not sure what to set 
the superclass of the Metaclass instance too.  (1b) If I leave it alone, my 
class is an instance of Class.  (1a) If I force it to MixinClass, then my 
class is an instance of MixinClass and my instance methods are ok, but the 
class-side confuses me a little - I have broken the metaclass superclass 
inheritence.  Do I really need to have a MixinProtoObject to root 
everything with MixinClass class as the first metaclass superclass, or can 
I stitch myself into a different point in the hierarchy and still have my 
class be an instance of MixinClass, rather than Class, but maintain the 
correct metaclass inheritence?  I believe it all relies on the 
implementation of 'meta new', especially with Interpreter>>formatOfClass: 
aClass, where aClass is a metaclass instance.

Cheers,
Rob



1a)	meta _ Metaclass new.
	meta
		superclass: MixinClass
		methodDictionary: MethodDictionary new
		format: MixinClass format.
	newClass _ meta new.


1b)	meta _ Metaclass new.
	meta
		superclass: newSuper class
		methodDictionary: MethodDictionary new
		format: MixinClass format.
	newClass _ meta new.



2)	newClass
		superclass: newSuper
		methodDictionary: MethodDictionary new
		format: newFormat;
		contextClass: aContextClass;
		setInstVarNames: instVars;
		organization: nil.
	^newClass




More information about the Squeak-dev mailing list