println("  public " + className + " make" + className + "(aterm.ATerm head, aterm.ATermList tail, aterm.ATermList annos) {");
println("  protected " + className + " make" + className + "(aterm.ATerm head, aterm.ATermList tail, aterm.ATermList annos) {");
	private void genFactoryMakeLists(ADT api) {		Iterator types = api.typeIterator();		while (types.hasNext()) {			Type type = (Type) types.next();			if (type instanceof ListType) {				String className = ListTypeGenerator.className(type);				String elementClassName = TypeGenerator.className(((ListType) type).getElementType());				String empty = "empty" + className;								println("  public " + className + " make" + className + "() {");				println("    return " + empty + ";");				println("  }");				println("  public " + className + " make" + className + "(" + elementClassName + " elem ) {");				println("    return (" + className + ") make" + className + "(elem, " + empty + ");");				println("  }");				println("  public " + className + " make" + className + "(" + elementClassName + " head, " + className + " tail) {");				println("    return (" + className + ") make" + className + "((aterm.ATerm) head, (aterm.ATermList) tail, empty);");				println("  }");				println("  public " + className + " make" + className + "(aterm.ATerm head, aterm.ATermList tail, aterm.ATermList annos) {");				println("    synchronized (proto" + className +") {");				println("      proto" + className + ".initHashCode(annos,head,tail);");				println("      return (" + className +") build(proto" + className + ");");				println("    }");				println("  }");			}		}	}