store/[org.clojure/clojure "1.8.0"] clj::clojure.core/defmethod

Official Documentation

Add notes
Arities
==================================================
   [multifn dispatch-val & fn-tail]

Docstring
==================================================
  Creates and installs a new method of multimethod associated with dispatch-value. 

Source

(defmacro defmethod
  "Creates and installs a new method of multimethod associated with dispatch-value. "
  {:added "1.0"}
  [multifn dispatch-val & fn-tail]
  `(. ~(with-meta multifn {:tag 'clojure.lang.MultiFn}) addMethod ~dispatch-val (fn ~@fn-tail)))

Example 1

Edit
;this example illustrates that the dispatch type
;does not have to be a symbol, but can be anything (in this case, it's a string)

(defmulti greeting
  (fn [x] (x "language")))

;params is not used, so we could have used [_]
(defmethod greeting "English" [params]
  "Hello!")

(defmethod greeting "French" [params]
  "Bonjour!")

;then can use this like this:
(def english-map {"id" "1", "language" "English"})
(def  french-map {"id" "2", "language" "French"})

=> (greeting english-map)
"Hello!"
=> (greeting french-map)
"Bounjour!"

Example 2

Edit
(defmulti service-charge (fn [acct] [(account-level acct) (:tag acct)]))
(defmethod service-charge [::acc/Basic ::acc/Checking]   [_] 25)
(defmethod service-charge [::acc/Basic ::acc/Savings]    [_] 10)
(defmethod service-charge [::acc/Premium ::acc/Account] [_] 0)

Example 3

Edit
;; Methods can be given a name.  Very useful in stack traces.
(defmethod foo "a" name-of-method [params] "was a")

Uses on crossclj