I finally got around to writing an "unbean" function.   As the name
suggests, it's the reverse of the bean function: it takes a class and
a map of property name/values and returns an instance of that class
with those property values.  So for example, if class House has
properties "address", "color", and "area", you can do this:

user=> (def h (unbean House {:address "100 Elm Street" :color
"red" :area 2500}))
#'user/h
user=> (.getAddress h)
"100 Elm Street"
user=> (bean h)
{:address "100 Elm Street", :color "red", :area 2500}
user=>

Questions:
1. It's a real function, not a macro, and it uses reflection, so it's
not something you would want to use in a  tight loop. Would a macro be
more appropriate?
2. Would this kind of thing be a useful addition to the core API?

Here's the code:

(defn unbean [clazz props]
  (let [x (.newInstance clazz)
        pmap (reduce (fn [m pd]
                       (let [name (.getName pd)
                             method (.getWriteMethod pd)]
                         (if (and method (= 1 (alength (. method 
(getParameterTypes)))))
                           (assoc m (keyword name) (fn [v] (. method (invoke x 
(into-array
[v])))))
                           m)))
                     {}
                     (.getPropertyDescriptors 
(java.beans.Introspector/getBeanInfo
clazz)))]
    (doseq [kv props]
        (((keyword (first kv)) pmap) (second kv)))
    x))

Bill Smith



--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Clojure" group.
To post to this group, send email to clojure@googlegroups.com
To unsubscribe from this group, send email to 
clojure+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/clojure?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to