(ns util.core
(:use clojure.pprint)
(:import (java.lang.reflect Modifier)))
(defmacro export-static-final-fields
"Exports all static final fields of class"
[class]
(letfn
[(field-basename [field-name]
(re-find #"[^\.]+$" field-name))
(field-fullname [field-name]
(str ((re-find #" ([^ ]+)\.[^ ]+$" field-name) 1) "/" (field-basename field-name)))
(static-final? [field]
(and (Modifier/isFinal field) (Modifier/isStatic field)))
(get-static-final-fields [class]
(for [field (.getFields class) :when (static-final? (.getModifiers field))] (str field)))]
`(do ~@(for [field (get-static-final-fields (resolve class))]
`(def ~(symbol (field-basename field)) ~(symbol (field-fullname field)))))))
(pprint (macroexpand-1 '(export-static-final-fields Integer)))
KG5zIHV0aWwuY29yZQogICg6dXNlIGNsb2p1cmUucHByaW50KQogICg6aW1wb3J0IChqYXZhLmxhbmcucmVmbGVjdCBNb2RpZmllcikpKQoKKGRlZm1hY3JvIGV4cG9ydC1zdGF0aWMtZmluYWwtZmllbGRzCiAgIkV4cG9ydHMgYWxsIHN0YXRpYyBmaW5hbCBmaWVsZHMgb2YgY2xhc3MiCiAgW2NsYXNzXQogIChsZXRmbiAKICAgIFsoZmllbGQtYmFzZW5hbWUgW2ZpZWxkLW5hbWVdCiAgICAgICAocmUtZmluZCAjIlteXC5dKyQiIGZpZWxkLW5hbWUpKQogICAgIChmaWVsZC1mdWxsbmFtZSBbZmllbGQtbmFtZV0KICAgICAgIChzdHIgKChyZS1maW5kICMiIChbXiBdKylcLlteIF0rJCIgZmllbGQtbmFtZSkgMSkgIi8iIChmaWVsZC1iYXNlbmFtZSBmaWVsZC1uYW1lKSkpCiAgICAgKHN0YXRpYy1maW5hbD8gW2ZpZWxkXQogICAgICAgKGFuZCAoTW9kaWZpZXIvaXNGaW5hbCBmaWVsZCkgKE1vZGlmaWVyL2lzU3RhdGljIGZpZWxkKSkpCiAgICAgKGdldC1zdGF0aWMtZmluYWwtZmllbGRzIFtjbGFzc10KICAgICAgIChmb3IgW2ZpZWxkICguZ2V0RmllbGRzIGNsYXNzKSA6d2hlbiAoc3RhdGljLWZpbmFsPyAoLmdldE1vZGlmaWVycyBmaWVsZCkpXSAoc3RyIGZpZWxkKSkpXQogICAgYChkbyB+QChmb3IgW2ZpZWxkIChnZXQtc3RhdGljLWZpbmFsLWZpZWxkcyAocmVzb2x2ZSBjbGFzcykpXQogICAgICAgIGAoZGVmIH4oc3ltYm9sIChmaWVsZC1iYXNlbmFtZSBmaWVsZCkpIH4oc3ltYm9sIChmaWVsZC1mdWxsbmFtZSBmaWVsZCkpKSkpKSkKIAoocHByaW50IChtYWNyb2V4cGFuZC0xICcoZXhwb3J0LXN0YXRpYy1maW5hbC1maWVsZHMgSW50ZWdlcikpKQ==