      )
   )
 
-(defn assumedLogLevel [loglevel]
+;TODO:something like (or x 1) but we check x against some invariants if it's non-truthy
+#_(defn fallback
+  [original & fallbacks]
+  
+  )
+
+(defn assumedValidIfPresent [validityfn presentfn thing & failmsg]
+  {:pre [(assumedTrue 
+           [
+            (ifn? validityfn)
+            "you didn't pass a valid ifn? as validityfn"
+            "you passed `"
+            validityfn
+            "`"
+            ]
+           [
+            (ifn? presentfn)
+            "you didn't pass a valid ifn? as presentfn"
+            "you passed `"
+            presentfn
+            "`"
+            ]
+           )]}
+  (cond (presentfn thing)
+    (assumedTrue [(validityfn thing)
+                  failmsg])
+    :else
+    ;not-present, not checked and return true
+    true
+    )
+  )
+
+(defn assumedValidLogLevel [loglevel]
   (assumedTrue [
                 (keyword? loglevel)
                 "loglevel must be a keyword ie. :info or :debug"

  )


(defmacro ^:private priv_functionget [& msg2]
  `(fn [x#]
     (logAny
       (or ~'loglevel :debug) 
       x# ~@msg2)
     )
  )

#_(defn ^:private priv_functionget [& msg2]
  '(fn [x#] 

rest = strings to be joined with space between them; or nil to skip
"
  [& [shift loglevel  :as all]]
  {:pre [
         (assumedValidIfPresent assumedValidShift notnil? shift)
         (assumedValidIfPresent assumedValidLogLevel notnil? loglevel)
         ]}
  (showLocation (let [msg (nthrest all 2)]
                  (cond (empty? msg)
                    (priv_functionget)
