let new_ ?start_tag ?end_tag ?tag_style ?pre_chomp ?post_chomp ?trim
  ?interpolate ?anycase ?include_path ?delimiter ?absolute ?relative
  ?default ?blocks ?auto_reset ?recursion ?variables ?constants
  ?constant_namespace ?namespace ?pre_process ?post_process ?process
  ?wrapper ?error ?errors ?eval_perl ?output ?output_path ?debug ?debug_format
  ?cache_size ?compile_ext ?compile_dir ?plugins ?plugin_base ?load_perl
  ?filters ?v1dollar ?load_templates ?load_plugins ?load_filters
  ?tolerant ?service ?context ?stash ?parser ?grammar () =

  let args = ref [] in
    may (fun v ->
           args := sv_of_string "START_TAG" :: sv_of_string v :: !args) start_tag;
    may (fun v ->
           args := sv_of_string "END_TAG" :: sv_of_string v :: !args) end_tag;
    may (fun v ->
           args := sv_of_string "TAG_STYLE" :: sv_of_string v :: !args) tag_style;
    may (fun v ->
           args := sv_of_string "PRE_CHOMP" :: sv_of_bool v :: !args) pre_chomp;
    may (fun v ->
           args := sv_of_string "POST_CHOMP" :: sv_of_bool v :: !args) post_chomp;
    may (fun v ->
           args := sv_of_string "TRIM" :: sv_of_bool v :: !args) trim;
    may (fun v ->
           args := sv_of_string "INTERPOLATE" :: sv_of_bool v :: !args) interpolate;
    may (fun v ->
           args := sv_of_string "ANYCASE" :: sv_of_bool v :: !args) anycase;
    may (fun v ->
           args := sv_of_string "INCLUDE_PATH" :: arrayref (av_of_string_list v) :: !args) include_path;
    may (fun v ->
           args := sv_of_string "DELIMITER" :: sv_of_string v :: !args) delimiter;
    may (fun v ->
           args := sv_of_string "ABSOLUTE" :: sv_of_bool v :: !args) absolute;
    may (fun v ->
           args := sv_of_string "RELATIVE" :: sv_of_bool v :: !args) relative;
    may (fun v ->
           args := sv_of_string "DEFAULT" :: sv_of_string v :: !args) default;
    may (fun v ->
           args := sv_of_string "BLOCKS" :: hashref (hv_of_string_pair_list v) :: !args) blocks;
    may (fun v ->
           args := sv_of_string "AUTO_RESET" :: sv_of_bool v :: !args) auto_reset;
    may (fun v ->
           args := sv_of_string "RECURSION" :: sv_of_bool v :: !args) recursion;
    may (fun v ->
           args := sv_of_string "VARIABLES" :: sv_of_variant v :: !args) variables;
    may (fun v ->
           args := sv_of_string "CONSTANTS" :: sv_of_variant v :: !args) constants;
    may (fun v ->
           args := sv_of_string "CONSTANT_NAMESPACE" :: sv_of_string v :: !args) constant_namespace;
    may (fun v ->
           args := sv_of_string "NAMESPACE" :: sv_of_variant v :: !args) namespace;
    may (fun v ->
           args := sv_of_string "PRE_PROCESS" :: arrayref (av_of_string_list v) :: !args) pre_process;
    may (fun v ->
           args := sv_of_string "POST_PROCESS" :: arrayref (av_of_string_list v) :: !args) post_process;
    may (fun v ->
           args := sv_of_string "PROCESS" :: arrayref (av_of_string_list v) :: !args) process;
    may (fun v ->
           args := sv_of_string "WRAPPER" :: arrayref (av_of_string_list v) :: !args) wrapper;
    may (fun v ->
           args := sv_of_string "ERROR" :: sv_of_string v :: !args) error;
    may (fun v ->
           args := sv_of_string "ERRORS" :: hashref (hv_of_string_pair_list v) :: !args) errors;
    may (fun v ->
           args := sv_of_string "EVAL_PERL" :: sv_of_bool v :: !args) eval_perl;
    may (fun v ->
           raise Not_implemented) output;
    may (fun v ->
           raise Not_implemented) output_path;
    may (fun v ->
           args := sv_of_string "DEBUG" :: sv_of_string v :: !args) debug;
    may (fun v ->
           args := sv_of_string "DEBUG_FORMAT" :: sv_of_string v :: !args) debug_format;
    may (fun v ->
           args := sv_of_string "CACHE_SIZE" :: sv_of_int v :: !args) cache_size;
    may (fun v ->
           args := sv_of_string "COMPILE_EXT" :: sv_of_string v :: !args) compile_ext;
    may (fun v ->
           args := sv_of_string "COMPILE_DIR" :: sv_of_string v :: !args) compile_dir;
    may (fun v ->
           args := sv_of_string "PLUGINS" :: hashref (hv_of_string_pair_list v) :: !args) plugins;
    may (fun v ->
           args := sv_of_string "PLUGIN_BASE" :: arrayref (av_of_string_list v) :: !args) plugin_base;
    may (fun v ->
           args := sv_of_string "LOAD_PERL" :: sv_of_bool v :: !args) load_perl;
    may (fun v ->
           raise Not_implemented) filters;
    may (fun v ->
           args := sv_of_string "V1DOLLAR" :: sv_of_bool v :: !args) v1dollar;
    may (fun v ->
           raise Not_implemented) load_templates;
    may (fun v ->
           raise Not_implemented) load_plugins;
    may (fun v ->
           raise Not_implemented) load_filters;
    may (fun v ->
           args := sv_of_string "TOLERANT" :: sv_of_bool v :: !args) tolerant;
    may (fun v ->
           raise Not_implemented) service;
    may (fun v ->
           raise Not_implemented) context;
    may (fun v ->
           raise Not_implemented) stash;
    may (fun v ->
           raise Not_implementedparser;
    may (fun v ->
           raise Not_implemented) grammar;
    let sv = call_class_method "Template" "new" !args in
      new template sv