Let's say you have a metaclass ATTRIBUTED-CLASS, so when you do
(defclass foo () ()
(:metaclass attributed-class))
you get something like
#<ATTRIBUTED-CLASS SCHEMA @ #x10f7f26a>
Then somebody comes and does
(defclass bar (foo) ())
and he gets
#<STANDARD-CLASS BAR @ #x10f82c02>
when what he really needs is
#<ATTRIBUTED-CLASS BAR @ #x10f82c02>
and you would like to hide the implementation-dependent metaclass.
I think that in many cases, if you can resolve the set of common subclasses of
the set of metaclasses of the direct superclasses of a class to a hierarchy,
taking the root of that hierarchy as the default metaclass is the way that you want to go, and not getting just STANDARD-CLASS instead.
For disambiguating more complicated cases, or for getting some other metaclass than this default one, the :metaclass option is there.
If you do not disambiguate by using the :metaclass option, then getting STANDARD-CLASS as the default would be OK.
When a direct superclass of the class being defined is a forward-referenced class, it is treated by the previous algorithm as if its metaclass were STANDARD-CLASS instead of FORWARD-REFERENCED-CLASS.
It seems that the only way of implementing this today is by defining an :around
method on ENSURE-CLASS-USING-CLASS which is not exactly great to specialize, so
maybe taking a look again at this part of the CLOS specification would be a good
idea.
--
Fernando D. Mato Mira
Computer Graphics Lab "Bury GIFs!! Get JPEGed!!!"
Swiss Federal Institute of Technology
········@di.epfl.ch
NeXTMail : ········@lignext.epfl.ch
FAX : +41 (21) 693 - 5328