title: Clojure multimethod dispath problem
body: <p>I have those two sources:</p>
  
  <pre><code>(ns odo.IComplex)
  (gen-interface
      :name odo.IComplex
      :methods [
          [getReal [] Double]
          [getImag [] Double]
          [getAbs  [] Double]
          [getArg  [] Double]
  
          [setReal [Double] void]
          [setImag [Double] void]
          [setAbs  [Double] void]
          [setArg  [Double] void]])
  
  (defprotocol PolarComplex
      (abs [this] [this value])
      (arg [this] [this value]))
  
  (defmulti polar-complex (fn([record abs arg] (class record))))
  </code></pre>
  
  <p>and </p>
  
  <pre><code>(ns odo.Complex
    (:gen-class
     :init init
     :state state
     :implements [odo.IComplex])
    (:use odo.IComplex))
  
  (defrecord State [^Double imag ^Double real]
    Object (toString [self] 
             (str real (if (&gt;= imag 0) " + " " - " ) (Math/abs imag) "j"
              " : " (abs self) " * exp[ " (arg self) " ]"))
  
    PolarComplex (abs [self]       (Math/sqrt (+ (* real real) (* imag imag))))
                 (abs [self value] (polar-complex self value (arg self)))
  
                 (arg [self]       (Math/atan2 real imag))
                 (arg [self value] (polar-complex self (abs self)  value)))
  
  (defmethod polar-complex PolarComplex [num abs arg]
      (assoc num :real (* abs (Math/cos arg)) :imag (* abs (Math/sin arg))))
  
  (defn -init [] [[] (atom (State. 0. 0.))])
  (defn -getImag [self] (:imag @(.state self)))
  (defn -getReal [self] (:real @(.state self)))
  (defn -getAbs  [self]  (abs @(.state self)))
  (defn -getArg  [self]  (arg @(.state self)))
  
  (defn -setImag [self value] (swap! (.state self) assoc  :imag  value))
  (defn -setReal [self value] (swap! (.state self) assoc  :real  value))
  (defn -setAbs  [self value] (swap! (.state self) abs value))
  (defn -setArg  [self value] (swap! (.state self) arg value))
  
  (defn -toString [self] (str @(.state self)))
  </code></pre>
  
  <p>and I'm ensured that <code>(isa? odo.Complex.State odo.IComplex.PolarComplex)</code> is <code>true</code></p>
  
  <p>but when I execute</p>
  
  <pre><code>(doto (odo.Complex.)
    (.setArg (/ Math/PI 4.)) (.setAbs (Math/sqrt 2)) (println) )
  </code></pre>
  
  <p>I get</p>
  
  <blockquote>
    <p>java.lang.IllegalArgumentException: No
    method in multimethod 'polar-complex'
    for  dispatch value: class
    odo.Complex.State</p>
  </blockquote>
  
  <p>Can you tell me why?</p>