jodd-madvoc/src/main/java/jodd/madvoc/component/ActionMethodParser.java
public ActionRuntime createActionRuntime(
		final ActionHandler actionHandler,
		final Class actionClass,
		final Method actionClassMethod,
		final Class<? extends ActionResult> actionResult,
		final Class<? extends ActionResult> defaultActionResult,
		final ActionFilter[] filters,
		final ActionInterceptor[] interceptors,
		final ActionDefinition actionDefinition,
		final boolean async,
		final boolean auth)
	{
		if (actionHandler != null) {

			return new ActionRuntime(
				actionHandler,
				actionClass,
				actionClassMethod,
				filters,
				interceptors,
				actionDefinition,
				NoneActionResult.class,
				NoneActionResult.class,
				async,
				auth,
				null,
				null);

		}

		final ScopeData scopeData = scopeDataInspector.inspectClassScopes(actionClass);

		// find ins and outs

		final Class[] paramTypes = actionClassMethod.getParameterTypes();
		final MethodParam[] params = new MethodParam[paramTypes.length];

		final Annotation[][] paramAnns = actionClassMethod.getParameterAnnotations();
		String[] methodParamNames = null;


		// for all elements: action and method arguments...
		for (int ndx = 0; ndx < paramTypes.length; ndx++) {
			Class paramType = paramTypes[ndx];

			// lazy init to postpone bytecode usage, when method has no arguments
			if (methodParamNames == null) {
				methodParamNames = actionMethodParamNameResolver.resolveParamNames(actionClassMethod);
			}

			final String paramName = methodParamNames[ndx];

			final Annotation[] parameterAnnotations = paramAnns[ndx];

			final ScopeData paramsScopeData = scopeDataInspector.inspectMethodParameterScopes(paramName, paramType, parameterAnnotations);

			MapperFunction mapperFunction = null;
			for (final Annotation annotation : parameterAnnotations) {
				if (annotation instanceof Mapper) {
					mapperFunction = MapperFunctionInstances.get().lookup(((Mapper) annotation).value());
					break;
				}
			}

			params[ndx] = new MethodParam(
				paramTypes[ndx],
				paramName,
				scopeDataInspector.detectAnnotationType(parameterAnnotations),
				paramsScopeData,
				mapperFunction
			);
		}

		return new ActionRuntime(
				null,
				actionClass,
				actionClassMethod,
				filters,
				interceptors,
				actionDefinition,
				actionResult,
				defaultActionResult,
				async,
				auth,
				scopeData,
				params);
	}
public ActionRuntime createActionRuntime(
		final ActionHandler actionHandler,
		final Class actionClass,
		final Method actionClassMethod,
		final Class<? extends ActionResult> actionResult,
		final Class<? extends ActionResult> defaultActionResult,
		final ActionFilter[] filters,
		final ActionInterceptor[] interceptors,
		final ActionDefinition actionDefinition,
		final boolean async,
		final boolean auth)
	{
		if (actionHandler != null) {

			return new ActionRuntime(
				actionHandler,
				actionClass,
				actionClassMethod,
				filters,
				interceptors,
				actionDefinition,
				NoneActionResult.class,
				NoneActionResult.class,
				async,
				auth,
				null,
				null);

		}

		final ScopeData scopeData = scopeDataInspector.inspectClassScopes(actionClass);

		// find ins and outs

		final Class[] paramTypes = actionClassMethod.getParameterTypes();
		final MethodParam[] params = new MethodParam[paramTypes.length];

		final Annotation[][] paramAnns = actionClassMethod.getParameterAnnotations();
		String[] methodParamNames = null;


		// for all elements: action and method arguments...
		for (int ndx = 0; ndx < paramTypes.length; ndx++) {
			Class paramType = paramTypes[ndx];

			// lazy init to postpone bytecode usage, when method has no arguments
			if (methodParamNames == null) {
				methodParamNames = actionMethodParamNameResolver.resolveParamNames(actionClassMethod);
			}

			final String paramName = methodParamNames[ndx];

			final Annotation[] parameterAnnotations = paramAnns[ndx];

			final ScopeData paramsScopeData = scopeDataInspector.inspectMethodParameterScopes(paramName, paramType, parameterAnnotations);

			MapperFunction mapperFunction = null;
			for (final Annotation annotation : parameterAnnotations) {
				if (annotation instanceof Mapper) {
					mapperFunction = MapperFunctionInstances.get().lookup(((Mapper) annotation).value());
					break;
				}
			}

			params[ndx] = new MethodParam(
				paramTypes[ndx],
				paramName,
				scopeDataInspector.detectAnnotationType(parameterAnnotations),
				paramsScopeData,
				mapperFunction
			);
		}

		return new ActionRuntime(
				null,
				actionClass,
				actionClassMethod,
				filters,
				interceptors,
				actionDefinition,
				actionResult,
				defaultActionResult,
				async,
				auth,
				scopeData,
				params);
	}
Creates new instance of action runtime configuration.
Initialize caches.