    (cond (or (symbol? arg) (string? arg)) (make-pipeline* arg [] {})
          (seq? arg) (make-pipeline* nil arg {})
          :else (make-pipeline* nil [] arg))))
+
+(defmacro make-pipeline
+  {:doc "Builds a Pipeline from command lines args and configuration. Also accepts a jobNameTemplate param which is a string in which the following var are interpolated:
+  - %A -> Application name
+  - %U -> User name
+  - %T -> Timestamp
+It means the template %A-%U-%T is equivalent to the default jobName"
+   :added "0.1.0"}
+  [& args]
+  `(binding [*pipeline-builder-caller* ~(str *ns*)]
+     (make-pipeline* ~@args)))
 
 (defn run-pipeline
   {:doc "Run the computation for a given pipeline or PCollection."

           [java.io InputStream OutputStream DataInputStream DataOutputStream File]
           [java.util UUID]
           [java.net URI]
           [clojure.lang MapEntry ExceptionInfo]))

(def required-ns (atom #{}))


         args-with-name (if (args "appName")
                          args
                          (assoc args "appName" *pipeline-builder-caller*))
         args-with-jobname (if-let [tpl (args-with-name "jobNameTemplate")]
                             (-> args-with-name
                                 (assoc "jobName" (job-name-template tpl args-with-name))
                                 (dissoc "jobNameTemplate"))
                             args-with-name)
         reformed-args (map (fn [[k v]] (str "--" k "=" v)) args-with-jobname)
         builder (PipelineOptionsFactory/fromArgs
                  (into-array String reformed-args))
         options (if itf
