private Method findActionMethod(Class<?> type, String methodName) {
        List<Method> methods = new ArrayList<Method>();
        Action detail = null;
        for (Method method : type.getDeclaredMethods()) {
            if (!isMethodValid(method, methodName)) {
                continue;
            }
            Action annotation = method.getAnnotation(Action.class);
            if (detail == null) {
                if (annotation != null) {
                    methods.clear();
                    detail = annotation;
                }
                methods.add(method);
            } else if (annotation != null) {
                methods.add(method);
            }
        }
        if (methods.isEmpty()) {
            if (Object.class.equals(type.getSuperclass())) {
                throw new IllegalArgumentException("No method '" + methodName + "' for class "
                        + actionBean.getClass().getName());
            }
            return findActionMethod(type.getSuperclass(), methodName);

        } else if (methods.size() > 1) {
            throw new IllegalArgumentException("Too many method '" + methodName + "' for class "
                    + actionBean.getClass().getName());
        }
        return methods.get(0);
    }