Just an example:<p><pre><code>    (derive ::wizard ::person)
    (derive ::warior ::person)

    (derive ::weapon ::thing)
    (derive ::dagger ::weapon)
    (derive ::sword ::weapon)
    (derive ::staff ::weapon)

    ;; defines dispatch function that returns (inheritable) categories to dispath
    ;; it&#x27;s very simple in this case
    (defmulti wield! (fn [p1 p2 thing]
                        [(type p2) (type thing)]))

    (defmethod wield! [::person ::thing] [p1 p2 thing]
              (say! p1 p2 &quot; refuse&quot;))
    (defmethod wield! [::person ::dagger] [p1 p2 thing]
              (take! p2 p1 thing)
              (say! p1 p2 &quot;accepts.&quot;))
    (defmethod wield! [::wizard ::staff] [p1 p2 thing]
              (take! p2 p1 thing)
              (say! p1 p2 &quot; gladly accepts.&quot;))
    (defmethod wield! [::warrior ::sword] [p1 p2 thing]
              (take! p2 p1 thing)
              (say! p1 p2 &quot; gladly accepts.&quot;))
</code></pre>
It obviously could be done in half the lines without using multimethods, but the result would be much less extensible.<p>BTW, with just 2 lines you can add gandalf and it just works (because there are no conflicting methods right now).<p><pre><code>    (derive ::gandalf ::wizard)
    (derive ::gandalf ::warrior)
</code></pre>
If there were any - you can set preferences to avoid errors.