Methods may be overloaded, i.e., there may be many methods with the same name, as long as the methods with the same name and number of arguments differ in their argument specializers. In particular, a given message can initially be implemented with a single unspecialized procedure and then later extended or replaced with several specialized implementations, without affecting clients of the original method, as occurs with the draw methods in the previous example. Argument specializers are distinct from type declarations. Argument specializers restrict the allowed implementations of actual arguments and are used as part of method lookup to locate a suitable method to handle a message send. Type declarations require that certain operations be supported by argument objects, but place no constraints on how those operations are implemented.
Type declarations have no effect on method lookup.
The name of a formal may be omitted if it is not needed in the method's body. Cecil's classless object model combines with its definition of argument specializers to support something similar to CLOS's eql specializers. In CLOS, an argument to a multi-method in a generic function may be restricted to apply only to a particular object by annotating the argument specializer with the eql keyword. Cecil needs no extra language mechanism to achieve a similar effect, since methods already are specialized on particular objects. Cecil's mechanism differs from CLOS's in that in Cecil such a method also will apply to any children of the specializing object, while in CLOS the method will apply only for that object.