Changes
This commit is contained in:
29
src/clj/sekai/macros/components.clj
Normal file
29
src/clj/sekai/macros/components.clj
Normal file
@@ -0,0 +1,29 @@
|
||||
(ns sekai.macros.components
|
||||
(:require [clojure.string :refer [capitalize]]))
|
||||
|
||||
(defmacro defcomponent [name fields & [generator constructor destructor]]
|
||||
(let [kwname (keyword name)
|
||||
compname (str "Component" (capitalize name))
|
||||
this (gensym)
|
||||
eid (gensym)]
|
||||
`(do
|
||||
(defrecord ~(symbol compname) ~fields
|
||||
~'IComponent
|
||||
(~'attach! [~this ~eid]
|
||||
(sekai.entity.entity/register-component! ~eid ~kwname ~this)
|
||||
~(when constructor
|
||||
`(~constructor ~eid ~this)))
|
||||
|
||||
(~'_detach! [~this ~eid]
|
||||
(sekai.entity.entity/deregister-component! ~eid ~kwname)
|
||||
~(when destructor
|
||||
`(~destructor ~eid ~this))))
|
||||
|
||||
(defn ~name [~@fields]
|
||||
(apply ~(symbol (str "->" compname))
|
||||
~(if generator
|
||||
`(let [result# (~generator ~@fields)]
|
||||
(if (sequential? result#)
|
||||
result#
|
||||
[result#]))
|
||||
fields))))))
|
Reference in New Issue
Block a user