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.