(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 :some-another-package
(:use :cl)
(:export :fuck-the-shit))
(in-package :some-another-package)
(defun fuck-the-shit (object fun)
(funcall fun object 31337))
(defpackage :usage-of-it
(:use :cl :interface-package :not-static-dep :some-another-package))
(in-package :usage-of-it)
(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)