Metaclasses
Every class is an object, so it must be an instance of some class — its metaclass:
18.1 Classes are objects
Every class is an object, so it must be an instance of some class — its metaclass:
Each class has exactly one metaclass, created automatically with it.
Class-side methods (like new, owner:) are instance methods of the metaclass.
Class-side instance variables are instance variables of the metaclass.
3 class. "→ SmallInteger"
SmallInteger class. "→ SmallInteger class (a metaclass)"
SmallInteger class class. "→ Metaclass"
Metaclass class. "→ Metaclass class"
Metaclass class class. "→ Metaclass (the loop closes)"18.2 Parallel hierarchies
Instance side Class side
ProtoObject ◄────instance of──── ProtoObject class
▲ ▲
Object ◄────instance of──── Object class
▲ ▲
Magnitude ◄────instance of──── Magnitude class
▲ ▲
Number ◄──── ... Number class
▲ ▲
SmallInteger ◄────instance of──── SmallInteger class
ProtoObject class superclass → Class → ClassDescription → Behavior → Object
Every "X class" is an instance of Metaclass.SmallInteger class superclass. "→ Integer class"
ProtoObject class superclass. "→ Class"
Class superclass. "→ ClassDescription"
ClassDescription superclass. "→ Behavior"
Behavior superclass. "→ Object"18.3 Behavior, ClassDescription, Class, Metaclass
Minimal state for objects that have instances: superclass, method dictionary, format; new, basicNew, method lookup support
Instance variable names, protocols/organization, comments Name, class variables, pools, subclasses, package — for ordinary classes
The class of a class; knows its sole instance (thisClass / instanceSide)
18.4 Why it matters
Class-side methods are inherited in parallel with instance methods: Square class >> side: can call self width:height:, which is defined in Rect class.
super new on the class side walks up the metaclass hierarchy until Behavior>>new.
Tools navigate both sides uniformly: Rect class >> #width:height:; Rect class instanceSide → Rect, Rect classSide → Rect class, Rect class isMeta → true.