docs: @SuppressWarnings({"checkstyle:npathcomplexity", "checkstyle:cyclomaticcomplexity"})
  	protected void generateExecutable(String name, XtendExecutable executable, boolean appendSelf, boolean isAbstract,
  			JvmTypeReference returnType, String comment, PyAppendable it, IExtraLanguageGeneratorContext context) {
  		it.append("def ").append(name); //$NON-NLS-1$
  		it.append("("); //$NON-NLS-1$
  		boolean firstParam = true;
  		if (appendSelf) {
  			firstParam = false;
  			it.append(getExpressionGenerator().getExtraLanguageKeywordProvider().getThisKeywordLambda().apply());
  		}
  		for (final XtendParameter parameter : executable.getParameters()) {
  			if (firstParam) {
  				firstParam = false;
  			} else {
  				it.append(", "); //$NON-NLS-1$
  			}
  			if (parameter.isVarArg()) {
  				it.append("*"); //$NON-NLS-1$
  			}
  			final String pname = it.declareUniqueNameVariable(parameter, parameter.getName());
  			it.append(pname).append(" : ").append(parameter.getParameterType().getType()); //$NON-NLS-1$
  		}
  		final LightweightTypeReference actualReturnType = getExpectedType(executable, returnType);
  		it.append(")"); //$NON-NLS-1$
  		if (actualReturnType != null) {
  			it.append(" -> ").append(actualReturnType); //$NON-NLS-1$
  		}
  		it.append(":"); //$NON-NLS-1$
  		it.increaseIndentation().newLine();
  		generateDocString(comment, it);
  		if (executable.getExpression() != null) {
  			it.openScope();
  			generate(executable.getExpression(), actualReturnType, it, context);
  			it.closeScope();
  		} else if (isAbstract) {
  			it.append("raise Exception(\"Unimplemented function\")"); //$NON-NLS-1$
  		} else {
  			it.append("pass"); //$NON-NLS-1$
  		}
  		it.decreaseIndentation().newLine();
  		//
  		// Generate the additional functions
  		final IActionPrototypeProvider prototypeProvider = getActionPrototypeProvider();
  		final QualifiedActionName actionName = prototypeProvider.createQualifiedActionName(
  				(JvmIdentifiableElement) getJvmModelAssociations().getPrimaryJvmElement(executable.getDeclaringType()),
  				name);
  		final InferredPrototype inferredPrototype = getActionPrototypeProvider().createPrototypeFromSarlModel(actionName,
  				Utils.isVarArg(executable.getParameters()), executable.getParameters());
  		for (final Entry<ActionParameterTypes, List<InferredStandardParameter>> types : inferredPrototype.getInferredParameterTypes().entrySet()) {
  			final List<InferredStandardParameter> argumentsToOriginal = types.getValue();
  			it.append("def ").append(name); //$NON-NLS-1$
  			it.append("(self"); //$NON-NLS-1$
  			for (final InferredStandardParameter parameter : argumentsToOriginal) {
  				if (!(parameter instanceof InferredValuedParameter)) {
  					it.append(", "); //$NON-NLS-1$
  					if (((XtendParameter) parameter.getParameter()).isVarArg()) {
  						it.append("*"); //$NON-NLS-1$
  					}
  					it.append(parameter.getName()).append(" : ").append(parameter.getType().getType()); //$NON-NLS-1$
  				}
  			}
  			it.append(")"); //$NON-NLS-1$
  			if (actualReturnType != null) {
  				it.append(" -> ").append(actualReturnType); //$NON-NLS-1$
  			}
  			it.append(":"); //$NON-NLS-1$
  			it.increaseIndentation().newLine();
  			if (actualReturnType != null) {
  				it.append("return "); //$NON-NLS-1$
  			}
  			it.append("self.").append(name).append("("); //$NON-NLS-1$ //$NON-NLS-2$
  			boolean first = true;
  			for (final InferredStandardParameter parameter : argumentsToOriginal) {
  				if (first) {
  					first = false;
  				} else {
  					it.append(", "); //$NON-NLS-1$
  				}
  				if (parameter instanceof InferredValuedParameter) {
  					final InferredValuedParameter valuedParameter = (InferredValuedParameter) parameter;
  					generate(((SarlFormalParameter) valuedParameter.getParameter()).getDefaultValue(), null, it, context);
  				} else {
  					it.append(parameter.getName());
  				}
  			}
  			it.append(")"); //$NON-NLS-1$
  			it.decreaseIndentation().newLine();
  		}
  	}