	public static boolean checkImpl(String methodPrefix, Class<?>... parameters) {
		if (parameters[0] == null) {
			System.err.println("Error: CheckImpl() first class parameter was null.");
			return false;
		}
		if (!(Zone.class.isAssignableFrom(parameters[0]))) {
			System.err
					.println("Error: CheckImpl() first class parameter ("
							+ parameters[0]
							+ ") was not Zone or a subclass, please give the current Zone class (using this.getClass()) as the first class parameter.");
			return false;
		}
		Method impl = null;
		try {
			Class<?>[] firstRemoved = new Class<?>[parameters.length - 1];
			System.arraycopy(parameters, 1, firstRemoved, 0, parameters.length - 1);
			if (Zone.class.getDeclaredMethod(methodPrefix + "Impl", firstRemoved) != null) {
				try {
					impl = parameters[0].getDeclaredMethod(methodPrefix + "Impl", firstRemoved);
				}
				catch (Exception e) {}
				if (impl == null) {
					try {
						impl = parameters[0].getDeclaredMethod(methodPrefix + "Impl", parameters);
						if (impl != null) {
							System.err
									.println(methodPrefix
											+ "Impl() in the class "
											+ parameters[0].getName()
											+ " should not have Zone as a parameter, please remove it to override "
											+ methodPrefix + "Impl() correctly.");
							impl = null;
						}
					}
					catch (Exception e) {}
				}
			}
		}
		catch (Exception e) {}
		if (impl == null && parameters[0].getSuperclass() != null
				&& parameters[0].getSuperclass() != Zone.class && parameters[0] != Zone.class) {
			Class<?> superClass = parameters[0].getSuperclass();
			Class<?>[] firstSupered = new Class<?>[parameters.length];
			System.arraycopy(parameters, 0, firstSupered, 0, parameters.length);
			firstSupered[0] = superClass;
			if (checkImpl(methodPrefix, firstSupered)) {
				return true;
			}
		}
		if (impl == null) {
			return false;
		}
		else {
			return true;
		}
	}

	public static boolean checkImpl(String methodPrefix, Class<?>... parameters) {
		if (parameters[0] == null) {
			System.err.println("Error: CheckImpl() first class parameter was null.");
			return false;
		}
		if (!(Zone.class.isAssignableFrom(parameters[0]))) {
			System.err
					.println("Error: CheckImpl() first class parameter ("
							+ parameters[0]
							+ ") was not Zone or a subclass, please give the current Zone class (using this.getClass()) as the first class parameter.");
			return false;
		}
		Method impl = null;
		try {
			Class<?>[] firstRemoved = new Class<?>[parameters.length - 1];
			System.arraycopy(parameters, 1, firstRemoved, 0, parameters.length - 1);
			if (parameters[0].getSuperclass().getDeclaredMethod(methodPrefix + "Impl", firstRemoved) != null) {
				try {
					impl = parameters[0].getDeclaredMethod(methodPrefix + "Impl", firstRemoved);
				}
				catch (Exception e) {}
				if (impl == null) {
					try {
						impl = parameters[0].getDeclaredMethod(methodPrefix + "Impl", parameters);
						if (impl != null) {
							System.err
									.println(methodPrefix
											+ "Impl() in the class "
											+ parameters[0].getName()
											+ " should not have Zone as a parameter, please remove it to override "
											+ methodPrefix + "Impl() correctly.");
							impl = null;
						}
					}
					catch (Exception e) {}
				}
			}
		}
		catch (Exception e) {}
		if (impl == null && parameters[0].getSuperclass() != null
				&& parameters[0].getSuperclass() != Zone.class && parameters[0] != Zone.class) {
			Class<?> superClass = parameters[0].getSuperclass();
			Class<?>[] firstSupered = new Class<?>[parameters.length];
			System.arraycopy(parameters, 0, firstSupered, 0, parameters.length);
			firstSupered[0] = superClass;
			if (checkImpl(methodPrefix, firstSupered)) {
				return true;
			}
		}
		if (impl == null) {
			return false;
		}
		else {
			return true;
		}
	}
