public void execute() {
		names = new NameGenerator();
		Obfuscate.println("Starting method renamer on " + cg.getClassName());
		// lets rename abstract class methods and interface methods first
		for (Method m : cg.getMethods()) {
			if (m.isNative() || m.getName().equals("<clinit>") || m.getName().equals("<init>")
					|| m.getName().equals("main")) {
				// we dont want to mess with native methods, constructors or
				// static initialisers
				continue;
			}
			// look through hierarchy and do not rename any overriden methods
			if (lookThroughHierarchy(cg, m, "")) {
				Obfuscate.println("\tNot renaming: " + m.getName());
				continue;
			}
			// generate a new name
			String oldName = m.getName();
			String newName = names.next();
			Obfuscate.println("\tRenaming " + oldName + " to " + newName);
			// fix the references in this class first
			int utf8 = m.getNameIndex();
			if (utf8 > -1) {
				ConstantUtf8 utf = (ConstantUtf8) cg.getConstantPool().getConstant(utf8);
				// set the new name
				if (utf.getBytes().equals(oldName))
					utf.setBytes(newName);
			}
			fixClass(cg, cg.getClassName(), oldName, newName, m);
			// fix references to this method in the other classes
			for (ClassGen clazz : Obfuscate.classes) {
				fixClass(clazz, cg.getClassName(), oldName, newName, m);
			}
		}
	}