Multimethods are similar to interfaces, they allow you to write a common contract and then a family of functions can fulfill that interface with a specific implementation.
They are extremely flexible, as you will see they grant you a very fine control over what function is going to get invoked for a specific data object.
Multimethods consist of three parts:
A function (or method) declaration
A dispatch function
Each possible implementation of the function
One of the most interesting features of multimethods is that you can implement new functions for already existing types without having to write wrappers around your currently existing object.
The multimethod declaration works the same way as the interface; you define a common contract for the polymorphic function, as shown:
(defmulti name docstring? attr-map? dispatch-fn& options)
The defmulti
macro defines the contract for your multimethod, it consists of:
The multimethod's name
An optional
doctstring
(this is the documentation...