+(defclass standard-generic-function (generic-function)
+ ((name
+ :initform nil
+ :initarg :name
+ :reader generic-function-name)
+ (methods
+ :initform ()
+ :accessor generic-function-methods
+ :type list)
+ (method-class
+ :initarg :method-class
+ :accessor generic-function-method-class)
+ (%method-combination
+ :initarg :method-combination
+ :accessor generic-function-method-combination)
+ (declarations
+ ;; KLUDGE: AMOP specifies :DECLARATIONS, while ANSI specifies
+ ;; :DECLARE. Allow either (but FIXME: maybe a note or a warning
+ ;; might be appropriate).
+ :initarg :declarations
+ :initarg :declare
+ :initform ()
+ :accessor generic-function-declarations)
+ (arg-info
+ :initform (make-arg-info)
+ :reader gf-arg-info)
+ (dfun-state
+ :initform ()
+ :accessor gf-dfun-state)
+ ;; Used to make DFUN-STATE & FIN-FUNCTION updates atomic.
+ (%lock
+ :initform (sb-thread:make-mutex :name "GF lock")
+ :reader gf-lock)
+ ;; Set to true by ADD-METHOD, REMOVE-METHOD; to false by
+ ;; MAYBE-UPDATE-INFO-FOR-GF.
+ (info-needs-update
+ :initform nil
+ :accessor gf-info-needs-update))
+ (:metaclass funcallable-standard-class)
+ (:default-initargs :method-class *the-class-standard-method*
+ :method-combination *standard-method-combination*))
+
+(defclass method (metaobject) ())
+
+(defclass standard-method (plist-mixin definition-source-mixin method)
+ ((%generic-function :initform nil :accessor method-generic-function)
+ (qualifiers :initform () :initarg :qualifiers :reader method-qualifiers)
+ (specializers :initform () :initarg :specializers
+ :reader method-specializers)
+ (lambda-list :initform () :initarg :lambda-list :reader method-lambda-list)
+ (%function :initform nil :initarg :function :reader method-function)
+ (%documentation :initform nil :initarg :documentation)
+ ;; True IFF method is known to have no CALL-NEXT-METHOD in it, or
+ ;; just a plain (CALL-NEXT-METHOD).
+ (simple-next-method-call
+ :initform nil
+ :initarg simple-next-method-call
+ :reader simple-next-method-call-p)))