(defn convertible?
"Returns true if it's possible to convert from c1 to c2"
[c1 c2]
(let [c1 (maybe-class c1)
c2 (maybe-class c2)]
(if (nil? c1)
(not (primitive? c2))
(or
(= c1 c2)
(.isAssignableFrom c2 c1)
(and (primitive? c2)
((convertible-primitives c2) c1))
(and (primitive? c1)
(.isAssignableFrom (box c1) c2))))))