public boolean methodIsOverridden(final Type classType,
			final NameAndType nat) {
		final String methodName = nat.name();
		final Type methodType = nat.type();

		db("ClassHierarchy: Is " + classType + "." + methodName + methodType
				+ " overridden?");

		final Collection subclasses = this.subclasses(classType);

		final Iterator iter = subclasses.iterator();
		while (iter.hasNext()) {
			final Type subclass = (Type) iter.next();

			db("Examining subclass " + subclass);

			// Obtain a ClassEditor for the class
			ClassEditor ce = null;

			try {
				ce = context.editClass(subclass.className());

			} catch (final ClassNotFoundException ex) {
				db(ex.getMessage());
				return (true);
			}

			// Examine each method in the subclass
			final MethodInfo[] methods = ce.methods();
			for (int i = 0; i < methods.length; i++) {
				final MethodEditor me = context.editMethod(methods[i]);
				if (me.name().equals(methodName)
						&& me.type().equals(methodType)) {
					db("  " + methodName + methodType + " is overridden by "
							+ me.name() + me.type());
					context.release(ce.classInfo());
					return (true); // Method is overridden
				}
			}

			// Recurse over subclasses
			if (methodIsOverridden(subclass, nat)) {
				context.release(ce.classInfo());
				return (true);
			}

			context.release(ce.classInfo());
		}

		// Got through all subclasses and method was not overridden
		db("  NO!");

		return (false);
	}