let make

    ?(at:(('c->string) option)=None)
    ?(it:(('a->string) option)=None)
    ~(ot:(string->'b))
    ?(script=false)
     (cmd:command) 
    ?(opt="")
    ?(args:('c option)=None) ?(input:('a option)=None) () =

    let cmd = if script then envelop cmd else cmd in

    let perform_treat t x = match (t,x) with 
      | ((Some f), (Some x)) -> (f x) 
      | (    _   ,  None)    -> "" 
      | ( None   , (Some x)) -> failwith "Wrapper.make: argument provided without a treatment" in 

    let args  = perform_treat at args  in
    let input = perform_treat it input in

    (cmd^" "^opt^" "^args^"\n") => ((Unix.shell ~trace:false ~input) || ot )