We often need to define a function for our domain that can be applied to many different types of domain entities. This is particularly useful when domain entities of different types are collected together in a composite data structure.
Object-oriented languages typically address this need via polymorphism. Polymorphism is a means of abstraction, allowing a domain operation to be decoupled from the types to which it can be applied. This makes your domain implementation more general and provides a way to extend behavior without modifying existing code.
Clojure provides two features that allow the creation of generic domain operations: multimethods and protocols. Choosing the specific function to invoke for a generic operation ...