(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)))