    validate it, transform it into a nested map with keyword keys, and
    then store it in memory."
   []
-  (->> (merge (read-property-file)
+  (->> (merge (read-property-files)
               (select-keys (System/getProperties)
-                           configurable-properties))
+                           configurable-properties)
+              (read-env-variables))
        coerce-properties
        transform
        (reset! properties)))

       concat
       (into {})))

(defn- transform [properties]
  (reduce (fn [accum [k v]]
            (let [parts (->> (str/split k #"\.")
                             (map keyword))]

  (c/coercer! PropertiesSchema
              c/string-coercion-matcher))

(defn read-property-files
  "Read all the property files (that exist) and merge the properties
   into a single map"
  []
  (->> files
       (keep (fn [file]
               (when-let [rdr (some-> file io/resource io/reader)]
