This comment has been minimized.

The only reason for abstract method error is the way repl is displaying your structure, so (Person. {:x 100}) will raise an exception, but (def person (Person. {:x 100}) won't. That can be easily fixed by not implementing IPersistentMap (which, when implemented forced repl to print object as a map) and implement clojure.lang.Associative instead. Without IPersistentMap repl presenter will fall back to visit-unknown without iterating, counting and other unnecessary stuff.