предположим, есть типы/классы/рода значений/объектов/сущностей.
Например, публикация и ее потомки - интервью, статься, фотоотчет, …
Есть базовая функция валидации публикации.
Я хочу расширять ее для каждого типа.
Мультиметоды тут не подходят, т.к. полностью заменяют реализацию.
Можно использовать протоколы и их реализацию через метаданные (появилось в clojure 10)
и потом просто
(vary-meta x update `pub/validation (fn [old] …)
но не понятно как такие значения сериализовывать и потом востанавливать, т.к. реализация функций потеряется.
или как вариант делать декораторы вроде
(alter-var-root #'agg/schema*
(fn [f]
(fn [type]
(cond-> (f type)
(isa? type :agg/test)
(assoc :test-agg/many {:db/cardinality :db.cardinality/many})))))