   (swap! cached-setting->value dissoc k)
   (del Setting :key (name k)))
 
-;; ## DEFSETTING
-
-(defn get-from-env-var
-  "Given a `Setting` like `:mandrill-api-key`, return the value of the corresponding env var,
-   e.g. `MB_MANDRILL_API_KEY`."
-  [setting-key]
-  (env/env (keyword (str "mb-" (name setting-key)))))
+(defn set*
+  "Set the value of a `Setting`, deleting it if VALUE is `nil` or an empty string."
+  [setting-key value]
+  (if (or (not value)
+          (and (string? value)
+               (not (seq value))))
+    (delete setting-key)
+    (set setting-key value)))
+
+
+;;; ## DEFSETTING
 
 (defmacro defsetting
   "Defines a new `Setting` that will be added to the DB at some point in the future.

         restore-cache-if-needed
         settings-list)

;; # PUBLIC

;; ## ACCESSORS

(defn get
  "Fetch value of `Setting`, first trying our cache, or fetching the value

      (when-let [v (sel :one :field [Setting :value] :key (name k))]
        (swap! cached-setting->value assoc k v)
        v)))

(defn- get-from-env-var
  "Given a `Setting` like `:mandrill-api-key`, return the value of the corresponding env var,
   e.g. `MB_MANDRILL_API_KEY`."
  [setting-key]
  (env/env (keyword (str "mb-" (name setting-key)))))

(defn get*
  "Get the value of a `Setting`. Unlike `get`, this also includes values from env vars."
  [setting-key]
  (or (get setting-key)
      (get-from-env-var setting-key)))


;;; ### SET / DELETE

(defn set
  "Set the value of a `Setting`.
