let make_enum name get_enums default help =
  let parse str =
    let enum_lst = get_enums () in
      if not (List.exists (fun (str', _) -> str = str') enum_lst) then
        raise
          (Parse_error
             (Printf.sprintf
                "%S is not an allowed value for %s."
                str name));
      str
  in
  let get =
    make
      ~name
      ~parse
      ~print:(fun s -> s)
      ~default
      ~help
      ~fcli:
      (fun get set ->
         [cli_name name,
          Arg.Symbol (List.map fst (get_enums ()), set),
          " "^help])
      ()
  in
    fun conf ->
      try
        get conf, List.assoc (get conf) (get_enums ())
      with Not_found ->
        failwithf
          "Enums list for %s has changed during execution." name