          trio/PTripleSeq
          (~'triple-seq
            [_#] (filtered-triple-seq {~'id (triple-map ~props _#)})))
+
        (defn ~ctor
+         {:doc ~(str "Constructs a new `" (namespace-munge *ns*) "." `~name "` entity from given map.\n"
+                     "  Applies entity's property intializers, defaults & validation.\n"
+                     "  In case of validation errors, throws map of errors using `slingshot/throw+`.")
+          :arglists '([~'props])}
          [opts#]
          (let [[opts# err#]
                (-> opts#

              (q/accumulate-result-vars)
              ;;((fn [x#] (prn x#) x#))
              (prepare-describe-results ~props)
              (~ctor)))
       )))

(defentity User (:User imago)
  {:user-name {:prop (:nick foaf)

   {} res))

(defmacro defentity
  [name type props]
  (let [->sym      (comp symbol clojure.core/name)
        props      (merge {:type {:prop "rdf:type"}} props)
        fields     (cons 'id (map ->sym (keys props)))
        ctor-name  (utils/->kebab-case name)
        ctor       (symbol (str 'make- ctor-name))
        dctor      (symbol (str 'describe- ctor-name))
        dctor-as   (symbol (str 'describe-as- ctor-name))
        mctor      (symbol (str 'map-> name))]
    `(let [validators# (build-validators ~props)
           defaults#   (extract-key ~props :default)
           inits#      (extract-key ~props :init)]
       ;;(prn "-------- " ~type)
