def METHOD_NAME():
    parser = argparse.ArgumentParser( description='Converts GFF3 files to GO Gene Association Format (GAF)')
    ## output file to be written
    parser.add_argument('-i', '--input_file', type=str, required=True, help='Path to an input file to be read' )
    parser.add_argument('-o', '--output_file', type=str, required=True, help='Path to an output file to be created' )
    parser.add_argument('-go', '--go_file', type=str, required=True, help='Gene Ontology (GO) file' )
    parser.add_argument('-db', '--database', type=str, required=True, help='Database issuing that IDs.  Example: UniProtKB' )
    parser.add_argument('-dbref', '--db_reference', type=str, required=True, help='DB reference, like PMID:2676709 (column 6)' )
    parser.add_argument('-ec', '--evidence_code', type=str, required=False, default='IEA', help='Like IEA (column 7)' )
    parser.add_argument('-t', '--taxon_id', type=int, required=True, help='NCBI taxon ID (column 13)' )
    parser.add_argument('-ad', '--annotation_date', type=str, required=False, help='Annotation date in YYYYMMDD format.  Default = GFF3 file datestamp' )
    parser.add_argument('-ab', '--assign_by', type=str, required=False, help='Assign by (column 15)  Defaults to --database argument value' )
    args = parser.parse_args()
    print("INFO: Parsing GFF3 objects", file=sys.stderr)
    (assemblies, features) = gff.get_gff3_features(args.input_file)
    print("INFO: Parsing GO file", file=sys.stderr)
    go_lookup = parse_go_file(args.go_file)
    annot_date = args.annotation_date
    if annot_date is None:
        annot_date = time.strftime('%Y%m%d', time.gmtime(os.path.getmtime(args.input_file)))
    assign_by = args.assign_by
    if assign_by is None:
        assign_by = args.database
    ofh = open(args.output_file, 'wt')
    ofh.write("!gaf-version: 2.0\n")
    for assembly_id in assemblies:
        for gene in assemblies[assembly_id].genes():
            for mRNA in gene.mRNAs():
                for polypeptide in mRNA.polypeptides():
                    for go_annot in polypeptide.annotation.go_annotations:
                        go_id = "GO:{0}".format(go_annot.go_id)
                        product = None
                        gene_sym = None
                        if go_id not in go_lookup:
                            raise Exception("ERROR: GO ID {0} not found in provided go.obo file".format(go_id))
                        if polypeptide.annotation.product_name is not None: product = polypeptide.annotation.product_name
                        if polypeptide.annotation.gene_symbol is not None:  gene_sym = polypeptide.annotation.gene_symbol
                        # Aspect is F, P or C, depending on which component/ontology the term comes from
                        ofh.write("{0}\t{1}\t{1}\t\t{2}\t{3}\t{4}\t\t{5}\t{6}"
                                  "\t{7}\tprotein\ttaxon:{8}\t{9}\t{10}\t"
                                  "\t\n".format(args.database, polypeptide.id, go_id, args.db_reference,
                                                args.evidence_code, go_lookup[go_id], product, gene_sym,
                                                args.taxon_id, annot_date, assign_by))
    print("INFO: Conversion complete.", file=sys.stderr)