Node:Customizing Class Redefinition, Previous:Default Class Redefinition Behaviour, Up:Redefining a Class



3.8.2 Customizing Class Redefinition

When define-class notices that a class is being redefined, it constructs the new class metaobject as usual, and then invokes the class-redefinition generic function with the old and new classes as arguments. Therefore, if the old or new classes have metaclasses other than the default <class>, class redefinition behaviour can be customized by defining a class-redefinition method that is specialized for the relevant metaclasses.

class-redefinition generic
Handle the class redefinition from old-class to new-class, and return the new class metaobject that should be bound to the variable specified by define-class's first argument.

class-redefinition (old-class <class>) (new-class <class>) method
Implements GOOPS' default class redefinition behaviour, as described in Default Class Redefinition Behaviour. Returns the metaobject for the new class definition.

An alternative class redefinition strategy could be to leave all existing instances as instances of the old class, but accepting that the old class is now "nameless", since its name has been taken over by the new definition. In this strategy, any existing subclasses could also be left as they are, on the understanding that they inherit from a nameless superclass.

This strategy is easily implemented in GOOPS, by defining a new metaclass, that will be used as the metaclass for all classes to which the strategy should apply, and then defining a class-redefinition method that is specialized for this metaclass:

(define-class <can-be-nameless> (<class>))

(define-method (class-redefinition (old <can-be-nameless>) (new <class>))
  new)

When customization can be as easy as this, aren't you glad that GOOPS implements the far more difficult strategy as its default!

Finally, note that, if class-redefinition itself is not customized, the default class-redefinition method invokes three further generic functions that could be individually customized:

and the default methods for these generic functions invoke further generic functions, and so on... The detailed protocol for all of these is described in MOP Specification.