@Override
    protected Statement methodInvoker(final FrameworkMethod method, final Object test) {
        return new Statement() {
            private final FrameworkMethod testMethod = method;
            private Object target = test;

            @Override
            public void evaluate() throws Throwable {
                Result result = initializeResultObject(testMethod);

                List<String> parameters = new ArrayList<>();
                if (includeDocumentation()) {
                    for (Annotation[] annotations : method.getMethod().getParameterAnnotations()) {
                        for (Annotation a : annotations) {
                            if (a instanceof Input) {
                                Input d = (Input) a;
                                parameters.add(d.value());
                                result.addParameter(d.name(), d.value());
                            }
                        }
                    }
                }

                Object returnObject = testMethod.invokeExplosively(target, parameters.toArray());

                if (returnObject != null && includeDocumentation()) {
                    for (Method m : returnObject.getClass().getMethods()) {
                        if (m.getAnnotation(Documented.class) != null) {
                            result.addResult(m.getName(), m.invoke(returnObject));
                        }
                    }
                }

                if (includeDocumentation()) {
                    result.produce();
                }
            }

            private boolean includeDocumentation() {
                return method.getAnnotation(Excluded.class) == null;
            }
        };
    }