         ~@specs))))
 
 
-(comment         
+(do #_comment         
 
  (defprotocol P2
    (p21 [x y])


 (defprotocol P0)

 (deftrait +foo+ [x] [y (atom x)] [] P2 (p21 [x z] (+ z @y)) (p22 [x] (swap! y inc)) P0)

 (deftrait +bar+ [w] [z (inc w)] [(+foo+ (* w 2))] P1 (p11 [x y] (- y w))))


;; Internal rep. of a trait is a fn from args to [binding-seq impl-map]
;; TODO: forn ow, args may be multiple evaluated?
(defmacro deftrait [name args state-bindings child-traits & protocols-and-methods]
  (let [[method-fn-defs protocol-method-bodies]
        (parse-protocols-and-methods (concat args (take-nth 2 state-bindings)) protocols-and-methods)]
;    (println method-fn-defs "\n" protocol-method-bodies)
    `(do (defn ~name ~args
           (apply merge-traits
                  [(concat (interleave '~args ~args) '~state-bindings)
                   '~protocol-method-bodies]
                  ~(parse-trait-form child-traits)))
         ~@method-fn-defs)))

(defn- render-trait-methods-inline [trait-map]
  (apply concat (map (partial apply cons) trait-map)))
