src/class-*.lisp: Improve metaclass selection.
[sod] / src / class-finalize-impl.lisp
index 32bc29b..d5dd60d 100644 (file)
 ;;;--------------------------------------------------------------------------
 ;;; Metaclasses.
 
-(defun maximum (items order what)
-  "Return a maximum item according to the non-strict partial ORDER."
-  (reduce (lambda (best this)
-           (cond ((funcall order best this) best)
-                 ((funcall order this best) this)
-                 (t (error "Unable to choose best ~A" what))))
-         items))
-
 (defmethod guess-metaclass ((class sod-class))
   "Default metaclass-guessing function for classes.
 
   ;; metaclasses resolved yet.  If we find this, then throw `bootstrapping'
   ;; so that `shared-initialize' on `sod-class' can catch it (or as a shot
   ;; across the bows of anyone else who calls us).
-  (maximum (mapcar (lambda (super)
-                    (if (slot-boundp super 'metaclass)
-                        (slot-value super 'metaclass)
-                        (throw 'bootstrapping nil)))
-                  (sod-class-direct-superclasses class))
-          #'sod-subclass-p
-          (format nil "metaclass for `~A'" class)))
+  (select-minimal-class-property (sod-class-direct-superclasses class)
+                                (lambda (super)
+                                  (if (slot-boundp super 'metaclass)
+                                      (slot-value super 'metaclass)
+                                      (throw 'bootstrapping nil)))
+                                #'sod-subclass-p class "metaclass"))
 
 ;;;--------------------------------------------------------------------------
 ;;; Sanity checking.