private ArrayList<Method> getAnnotatedMethodsRecursively(Class<?> klass) {
		if (klass == null || klass.equals(Class.class)) {
			annotatedMethodsByClass.put(klass, null);
			return null;
		}
		if (annotatedMethodsByClass.containsKey(klass)) {
			return annotatedMethodsByClass.get(klass);
		}
		ArrayList<Method> result = new ArrayList<Method>();
		Method[] methods = klass.getDeclaredMethods();
		if (methods == null) {
			annotatedMethodsByClass.put(klass, null);
			return null;
		}
		for (Method method : methods) {
			ASticky annotation = method.getAnnotation(ASticky.class);
			if (annotation != null) {
				method.setAccessible(true);
				result.add(method);
			}
		}
		ArrayList<Method> methodsFromSuperClass = getAnnotatedMethodsRecursively(klass.getSuperclass());
		if (methodsFromSuperClass != null) {
			result.addAll(methodsFromSuperClass);
		}
		annotatedMethodsByClass.put(klass, result);
		return result;
	}