docs: def getUI(prog_name, args):
    """Build and return user interface object for this script."""
    longDescription = "Given a set of BED intervals, compute a profile of " +\
                      "conservation by averaging over all intervals using a " +\
                      "whole genome alignment to a set of relevent species." +\
                      "\n\n" +\
                      "Usage: " + prog_name + " [options] regions.bed " +\
                      "genome-alig species" +\
                      "\n\n" +\
                      "genome-alig can be either a single MAF file, or a " +\
                      "directory of MAF files. In the latter case, the " +\
                      "directory may also optionally contain index files for " +\
                      "the alignment files."
    shortDescription = longDescription
  
    ui = CLI(prog_name, shortDescription, longDescription)
    # gotta have two args -- MAF dir/file and BED regions.
    # Input by stdin not allowed
    ui.minArgs = 3
    ui.maxArgs = 4
    ui.addOption(Option(short="o", long="output", argName="filename",
                        description="output to given file, else stdout",
                        required=False, type=str))
    ui.addOption(Option(short="w", long="window", argName="size",
                        description="size of window to compute around each " +
                                    "interval; " +
                                    str(DEFAULT_WINDOW_SIZE) +
                                    " to use whole interval. " +
                                    "Default " + str(DEFAULT_WINDOW_SIZE),
                        required=False, type=int))
    ui.addOption(Option(short="e", long="extensions", argName="extension",
                        description="if genome-alig specifies a directory, " +
                                    "treat files with this extension as " +
                                    "alignment files.", required=False,
                                    type=str))
    ui.addOption(Option(short="i", long="index-extensions", argName="extension",
                        description="if genome-alig specifies a directory, " +
                                    "treat files with this extension as " +
                                    "index files for alignments.",
                                    required=False, type=str))
    ui.addOption(Option(short="f", long="fail-no-index",
                        description="fail if an alignment file without an " +
                                    "index is found; otherwise index-less " +
                                    "alignment files are loaded whole (which " +
                                    "might be slow if they're large, and " +
                                    "might require a lot of memory)",
                        default=False, required=False))
    ui.addOption(Option(short="m", long="missing", argName="strategy",
                        description="how to treat missing sequences in " +
                                    "blocks. Options are " +
                                    ", ".join([str(x.name) for x in
                                               MissingSequenceHandler]),
                                    required=False, type=str))
    ui.addOption(Option(short="s", long="species", argName="species",
                        description="consider only these species. Default is " +
                                    "all.", required=False, type=str))
    ui.addOption(Option(short="v", long="verbose",
                        description="output additional messages to stderr " +
                                    "about run (default: " +
                                    str(DEFAULT_VERBOSITY) + ")",
                        default=DEFAULT_VERBOSITY, required=False))
    ui.addOption(Option(short="h", long="help",
                        description="show this help message ", special=True))
    ui.addOption(Option(short="u", long="test",
                        description="run unit tests ", special=True))
  
    ui.parseCommandLine(args)
    return ui