changeset 13:c6009a144727

Layer decorator macro.
author Mikhail Kryshen <mikhail@kryshen.net>
date Mon, 14 Jun 2010 06:26:07 +0400
parents cd8a378414d1
children 0a2fafca72d8
files src/indyvon/core.clj
diffstat 1 files changed, 25 insertions(+), 12 deletions(-) [+]
line diff
     1.1 --- a/src/indyvon/core.clj	Mon Jun 14 05:04:03 2010 +0400
     1.2 +++ b/src/indyvon/core.clj	Mon Jun 14 06:26:07 2010 +0400
     1.3 @@ -16,18 +16,24 @@
     1.4  (defn default-context []
     1.5    (LayerContext. nil nil 0 0 0 0 nil nil))
     1.6  
     1.7 -(defmacro reify-layer [& fns]
     1.8 -  (let [method-map {'size [['_ '_] [0 0]]
     1.9 -                    'anchor [['_ '_] [0 0]]}
    1.10 -        method-map (loop [fns fns
    1.11 -                          mm method-map]
    1.12 -                     (if-let [form (first fns)]
    1.13 -                       (recur (next fns)
    1.14 -                              (conj mm [(first form) (next form)]))
    1.15 -                       mm))
    1.16 -        methods (for [m method-map]
    1.17 -                  (cons (first m) (second m)))]
    1.18 -    `(reify Layer ~@methods)))
    1.19 +(defn- spec-map
    1.20 +  ([specs]
    1.21 +     (spec-map {} specs))
    1.22 +  ([mm specs]
    1.23 +     (if-let [form (first specs)]
    1.24 +       (recur (conj mm [(first form) (next form)])
    1.25 +              (next specs))
    1.26 +       mm)))
    1.27 +
    1.28 +(defn- merge-specs [s1 s2]
    1.29 +  (for [spec (spec-map (spec-map s1) s2)]
    1.30 +    (cons (first spec) (second spec))))
    1.31 +     
    1.32 +(defmacro reify-layer [& specs]
    1.33 +  `(reify Layer ~@(merge-specs
    1.34 +                   '((size [_ _] [0 0])
    1.35 +                     (anchor [_ _] [0 0]))
    1.36 +                   specs)))
    1.37  
    1.38  (defn- make-graphics [g x y w h clip]
    1.39    (if clip
    1.40 @@ -64,3 +70,10 @@
    1.41           (finally
    1.42            (.dispose graphics))))))
    1.43  
    1.44 +(defmacro decorate-layer [layer & specs]
    1.45 +  `(let [layer# ~layer]
    1.46 +     (reify Layer ~@(merge-specs
    1.47 +                     `((~'render! [l# c# g#] (draw! c# layer# g#))
    1.48 +                       (~'size [l# c#] (size layer# c#))
    1.49 +                       (~'anchor [l# c#] (anchor layer# c#)))
    1.50 +                     specs))))