   {:pre [(vector? entity-forms)]}
   (let [entity-symb               (symbol (format "%sEntity" (name entity)))
         internal-post-select-symb (symbol (format "internal-post-select-%s" (name entity)))
-        entity-map                (eval `(macrolet-entity-map ~entity ~@entity-forms))
+        unevaled-entity-map       (macroexpand-all `(macrolet-entity-map ~entity ~@entity-forms))
+        entity-map                (eval unevaled-entity-map)
         [methods specs]           (split-with list? methods+specs)]
     `(do
        (defrecord ~entity-symb []

       (extend ~entity-symb
         IEntity ~(merge default-entity-method-implementations
                         {:internal-pre-insert  `(fn [~'_ obj#]
                                                   (-> (apply-type-fns obj# :in ~entity-map)
                                                       ~@(when (::timestamped entity-map)
                                                           [update-created-at-updated-at])))
                          :internal-pre-update  `(fn [~'_ obj#]
                                                   (-> (apply-type-fns obj# :in ~entity-map)
                                                       ~@(when (::timestamped entity-map)
                                                           [update-updated-at])))
                          :internal-post-select `(fn [~'_ obj#]


(defn- identity-second [_ obj] obj)
(def ^:private constantly-nil (constantly nil))

(def ^:const ^:private default-entity-method-implementations
  {:pre-insert         #'identity-second
