(defprotocol Thing (thing [_])) (defprotocol Operation (operation [_])) (defrecord Delegator [delegate] Operation (operation [_] (try (thing delegate) (catch IllegalArgumentException e "default implementation")))) (defrecord Delegate [] Thing (thing [_] "delegate implementation"))