- An
Object
is a set of instance variables and a pointer to a 'singleton class'. - Properties are looked up in the instance variables, methods are dispatched via the singleton class.
Module
is a subtype ofObject
. AModule
is a set of methods and an ordered list of zero-or-more 'parent' modules.- Module
A
becomes a parent of moduleB
viaB.include(A)
. - Method lookup works by doing a depth-first right-to-left search of a module tree.
Class
is a subtype ofModule
. AClass
is aModule
that can be instantiated.- A
Class
has only one 'superclass'. A class includes its superclass as its first parent module for the purposes of method dispatch. A class's singleton class includes the superclass's singleton class as its first parent. - The default superclass of all classes is
Object
. Object
includes theKernel
module as a parent.
- Although
Class
is a subtype ofModule
, you cannot callB.include(A)
ifA
is aClass
. - Singleton classes are not really classes. You cannot instantiate or inherit from them.
obj.extend(M)
is sugar forobj.singleton_class.include(M)
.
what is all this stuff I see about people doing class Foo << self (extending the module onto itself?)