learning about defrecord and defprotocol, bottom of core.clj is a mess atm