[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
8.12.2 Customizing Class Redefinition
When define-class
notices that a class is being redefined, it
constructs the new class metaobject as usual, 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.
- generic: class-redefinition
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.
- method: class-redefinition (old-class <class>) (new-class <class>)
Implements GOOPS’ default class redefinition behaviour, as described in Default Class Redefinition Behaviour. Returns the metaobject for the new class definition.
The default class-redefinition
method, for classes with the
default metaclass <class>
, calls the following generic functions,
which could of course be individually customized.
- generic: remove-class-accessors! old
The default
remove-class-accessors!
method removes the accessor methods of the old class from all classes which they specialize.
- generic: update-direct-method! method old new
The default
update-direct-method!
method substitutes the new class for the old in all methods specialized to the old class.
- generic: update-direct-subclass! subclass old new
The default
update-direct-subclass!
method invokesclass-redefinition
recursively to handle the redefinition of subclasses.
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!
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This document was generated on April 20, 2013 using texi2html 5.0.