Function: cl--generic-standard-method-combination
cl--generic-standard-method-combination is a byte-compiled function
defined in cl-generic.el.gz.
Signature
(cl--generic-standard-method-combination GENERIC METHODS)
Source Code
;; Defined in /usr/src/emacs/lisp/emacs-lisp/cl-generic.el.gz
(defun cl--generic-standard-method-combination (generic methods)
(let ((mets-by-qual ()))
(dolist (method methods)
(let ((qualifiers (cl-method-qualifiers method)))
(if (eq (car qualifiers) :extra) (setq qualifiers (cddr qualifiers)))
(unless (member qualifiers '(() (:after) (:before) (:around)))
(error "Unsupported qualifiers in function %S: %S"
(cl--generic-name generic) qualifiers))
(push method (alist-get (car qualifiers) mets-by-qual))))
(cond
((null mets-by-qual)
(lambda (&rest args)
(apply #'cl-no-applicable-method generic args)))
((null (alist-get nil mets-by-qual))
(lambda (&rest args)
(apply #'cl-no-primary-method generic args)))
(t
(let* ((fun nil)
(ab-call (lambda (m) (cl-generic-call-method generic m)))
(before
(mapcar ab-call (reverse (cdr (assoc :before mets-by-qual)))))
(after (mapcar ab-call (cdr (assoc :after mets-by-qual)))))
(dolist (method (cdr (assoc nil mets-by-qual)))
(setq fun (cl-generic-call-method generic method fun)))
(when (or after before)
(let ((next fun))
(setq fun (lambda (&rest args)
(dolist (bf before)
(apply bf args))
(prog1
(apply next args)
(dolist (af after)
(apply af args)))))))
(dolist (method (cdr (assoc :around mets-by-qual)))
(setq fun (cl-generic-call-method generic method fun)))
fun)))))