(defpackage :interface-package
(:use :cl)
(:export :foo :bar))
(in-package :interface-package)
(defgeneric foo (obj something))
(defgeneric bar (obj something))
(defpackage :not-static-dep
(:use :cl :interface-package)
(:export :AB :BC))
(in-package :not-static-dep)
(defclass AB ()
((nnn :initarg :nnn
:type number
:reader nnn)))
(defmethod interface-package:foo ((obj AB) (smth number))
(format t "FOO for AB: ~A ~A~&" (nnn obj) smth))
(defmethod interface-package:bar ((obj AB) (smth number))
(format t "BAR for AB: ~A ~A~&" (nnn obj) smth))
(defclass BC ()
((mmm :initarg :mmm
:type number
:reader mmm)))
(defmethod interface-package:foo ((obj BC) (smth number))
(format t "FOO for BC: ~A ~A~&" (mmm obj) smth))
(defmethod interface-package:bar ((obj BC) (smth number))
(format t "BAR for BC: ~A ~A~&" (mmm obj) smth))
(defpackage :use-all-the-above
(:use :cl :interface-package :not-static-dep))
(in-package :use-all-the-above)
(defun fuck-the-shit (object fun)
(funcall fun object 31337))
(defparameter ab (make-instance 'AB :nnn 42))
(defparameter bc (make-instance 'BC :mmm 777))
(fuck-the-shit ab #'foo)
(fuck-the-shit bc #'foo)
(fuck-the-shit ab #'bar)
(fuck-the-shit bc #'bar)