DI-контейнер

Требования

Требуется реализовать DI-контейнер для Clojure, обеспечивающий поддержку:
  1. внедрения зависимости по заданному протоколу (Clojure Protocol)
  2. конфигурации (также на Clojure), обеспечивающей:
  3. пользовательской инициализации/деинициализации объектов (по аналогии с аннотациями JavaEE @PostConstruct и @PreDestroy).

Дополнительные требования

Обеспечьте поддержку следующих возможностей:

Рекомендации

С понятием DI рекомендуется подробнее ознакомиться здесь.
Конкретная реализация, которую можно рассматривать как образец.