docs: protected void appendCapacityContextAwareWrapper(SarlCapacity source, JvmGenericType inferredJvmType) {
  		final JvmGenericType innerType = this.typesFactory.createJvmGenericType();
  		innerType.setInterface(false);
  		innerType.setAbstract(false);
  		innerType.setVisibility(JvmVisibility.PUBLIC);
  		innerType.setStatic(true);
  		innerType.setStrictFloatingPoint(false);
  		innerType.setFinal(false);
  		final String innerTypeName = Capacity.ContextAwareCapacityWrapper.class.getSimpleName();
  		innerType.setSimpleName(innerTypeName);
  
  		inferredJvmType.getMembers().add(innerType);
  
  		this.typeBuilder.setDocumentation(innerType, "@ExcludeFromApidoc"); //$NON-NLS-1$
  
  		final JvmTypeParameter typeParameter = this.typesFactory.createJvmTypeParameter();
  		typeParameter.setName("C"); //$NON-NLS-1$
  		final JvmUpperBound constraint = this.typesFactory.createJvmUpperBound();
  		constraint.setTypeReference(this._typeReferenceBuilder.typeRef(inferredJvmType));
  		typeParameter.getConstraints().add(constraint);
  		innerType.getTypeParameters().add(typeParameter);
  
  		final Iterator<JvmTypeReference> extendedTypeIterator = inferredJvmType.getExtendedInterfaces().iterator();
  		if (extendedTypeIterator.hasNext()) {
  			final JvmTypeReference extendedType = extendedTypeIterator.next();
  			final JvmTypeReference superType = this._typeReferenceBuilder.typeRef(
  					extendedType.getQualifiedName() + "$" + innerTypeName, //$NON-NLS-1$
  					this._typeReferenceBuilder.typeRef(typeParameter));
  			innerType.getSuperTypes().add(superType);
  		}
  
  		innerType.getSuperTypes().add(this._typeReferenceBuilder.typeRef(inferredJvmType));
  
  		final JvmConstructor constructor = this.typesFactory.createJvmConstructor();
  		constructor.setVisibility(JvmVisibility.PUBLIC);
  		innerType.getMembers().add(constructor);
  		final JvmFormalParameter parameter1 = this.typesFactory.createJvmFormalParameter();
  		parameter1.setName("capacity"); //$NON-NLS-1$
  		parameter1.setParameterType(this._typeReferenceBuilder.typeRef(typeParameter));
  		constructor.getParameters().add(parameter1);
  		final JvmFormalParameter parameter2 = this.typesFactory.createJvmFormalParameter();
  		parameter2.setName("caller"); //$NON-NLS-1$
  		parameter2.setParameterType(this._typeReferenceBuilder.typeRef(AgentTrait.class));
  		constructor.getParameters().add(parameter2);
  		setBody(constructor, it -> {
  			it.append("super(capacity, caller);"); //$NON-NLS-1$
  		});
  
  		final Set<ActionPrototype> createdActions = new TreeSet<>();
  		for (final JvmGenericType sourceType : Iterables.concat(
  				Collections.singletonList(inferredJvmType),
  				Iterables.transform(Iterables.skip(inferredJvmType.getExtendedInterfaces(), 1), it -> {
  					return (JvmGenericType) it.getType();
  				}))) {
  			copyNonStaticPublicJvmOperations(sourceType, innerType, createdActions, (operation, it) -> {
  				it.append("try {"); //$NON-NLS-1$
  				it.newLine();
  				it.append("  ensureCallerInLocalThread();"); //$NON-NLS-1$
  				it.newLine();
  				it.append("  "); //$NON-NLS-1$
  				if (operation.getReturnType() != null && !Objects.equal("void", operation.getReturnType().getIdentifier())) { //$NON-NLS-1$
  					it.append("return "); //$NON-NLS-1$
  				}
  				it.append("this.capacity."); //$NON-NLS-1$
  				it.append(operation.getSimpleName());
  				it.append("("); //$NON-NLS-1$
  				boolean first = true;
  				for (final JvmFormalParameter fparam : operation.getParameters()) {
  					if (first) {
  						first = false;
  					} else {
  						it.append(", "); //$NON-NLS-1$
  					}
  					it.append(fparam.getName());
  				}
  				it.append(");"); //$NON-NLS-1$
  				it.newLine();
  				it.append("} finally {"); //$NON-NLS-1$
  				it.newLine();
  				it.append("  resetCallerInLocalThread();"); //$NON-NLS-1$
  				it.newLine();
  				it.append("}"); //$NON-NLS-1$
  			});
  		}
  	}