+ #+mop-slot-order-reversed (reverse (class-slots class))
+ #-mop-slot-order-reversed (class-slots class))
+
+(defun ordered-class-direct-slots (class)
+ "Gets an ordered list of direct class slots"
+ ;; NB: this used to return effective-slot-definitions in direct
+ ;; opposition to the function name. Not sure why
+ (setf class (to-class class))
+ #+mop-slot-order-reversed (reverse (class-direct-slots class))
+ #-mop-slot-order-reversed (class-direct-slots class))
+
+(defun find-slot-if (class predicate &optional direct? recurse?)
+ "Looks up a direct-slot-definition by name"
+ (setf class (to-class class))
+ (labels ((find-it (class)
+ (let* ((slots (if direct?
+ (ordered-class-direct-slots class)
+ (ordered-class-slots class)))
+ (it (find-if predicate slots)))
+ (or it
+ (when recurse?
+ (loop for sup in (class-direct-superclasses class)
+ for rtn = (find-it sup)
+ until rtn
+ finally (return rtn)))))))
+ (find-it class)))
+
+(defun find-slot-by-name (class slot-name &optional direct? recurse?)
+ "Looks up a direct-slot-definition by name"
+ (setf class (to-class class)
+ slot-name (to-slot-name slot-name))
+ (find-slot-if class (lambda (slot-def) (eql (to-slot-name slot-def) slot-name))
+ direct? recurse?))