docs: protected void generateBuilderFactoryContributions() {
  		final List<TopElementDescription> topElements = generateTopElements(true, false);
  		final boolean enableAppenders = getCodeBuilderConfig().isISourceAppendableEnable();
  		for (final TopElementDescription element : topElements) {
  			final String createFunctionName = "create" //$NON-NLS-1$
  					+ Strings.toFirstUpper(element.getElementDescription().getName());
  			this.builderFactoryContributions.addContribution(new StringConcatenationClient() {
  				@Override
  				protected void appendTo(TargetStringConcatenation it) {
  					it.append("\t/** Create the factory for a " + getLanguageName() + " " //$NON-NLS-1$ //$NON-NLS-2$
  							+ element.getElementDescription().getElementType().getSimpleName() + "."); //$NON-NLS-1$
  					it.newLine();
  					it.append("\t * @param name the name of the " + element.getElementDescription().getName()); //$NON-NLS-1$
  					it.newLine();
  					it.append("\t * @param resourceSet the set of the resources that must be used for"); //$NON-NLS-1$
  					it.newLine();
  					it.append("\t *    containing the generated resource, and resolving types from names."); //$NON-NLS-1$
  					it.newLine();
  					it.append("\t * @return the factory."); //$NON-NLS-1$
  					it.newLine();
  					it.append("\t */"); //$NON-NLS-1$
  					it.newLine();
  					it.append("\t@"); //$NON-NLS-1$
  					it.append(Pure.class);
  					it.newLine();
  					it.append("\tpublic "); //$NON-NLS-1$
  					it.append(element.getElementDescription().getBuilderInterfaceType());
  					it.append(" "); //$NON-NLS-1$
  					it.append(createFunctionName);
  					it.append("(String name, "); //$NON-NLS-1$
  					it.append(ResourceSet.class);
  					it.append(" resourceSet) {"); //$NON-NLS-1$
  					it.newLine();
  					it.append("\t\t return "); //$NON-NLS-1$
  					it.append(createFunctionName);
  					it.append("(name, createResource(resourceSet));"); //$NON-NLS-1$
  					it.newLine();
  					it.append("\t}"); //$NON-NLS-1$
  					it.newLineIfNotEmpty();
  					it.newLine();
  					it.append("\t/** Create the factory for a " + getLanguageName() + " " //$NON-NLS-1$ //$NON-NLS-2$
  							+ element.getElementDescription().getElementType().getSimpleName() + "."); //$NON-NLS-1$
  					it.newLine();
  					it.append("\t * @param name the name of the " + element.getElementDescription().getName()); //$NON-NLS-1$
  					it.newLine();
  					it.append("\t * @param resource the resource that must be used for"); //$NON-NLS-1$
  					it.newLine();
  					it.append("\t *    containing the generated element, and resolving types from names."); //$NON-NLS-1$
  					it.newLine();
  					it.append("\t * @return the factory."); //$NON-NLS-1$
  					it.newLine();
  					it.append("\t */"); //$NON-NLS-1$
  					it.newLine();
  					it.append("\t@"); //$NON-NLS-1$
  					it.append(Pure.class);
  					it.newLine();
  					it.append("\tpublic "); //$NON-NLS-1$
  					it.append(element.getElementDescription().getBuilderInterfaceType());
  					it.append(" "); //$NON-NLS-1$
  					it.append(createFunctionName);
  					it.append("(String name, "); //$NON-NLS-1$
  					it.append(Resource.class);
  					it.append(" resource) {"); //$NON-NLS-1$
  					it.newLine();
  					it.append("\t\t"); //$NON-NLS-1$
  					it.append(getScriptBuilderInterface());
  					it.append(" scriptBuilder = createScript(getFooPackageName(), resource);"); //$NON-NLS-1$
  					it.newLine();
  					it.append("\t\treturn scriptBuilder.add"); //$NON-NLS-1$
  					it.append(Strings.toFirstUpper(element.getElementDescription().getName()));
  					it.append("(name);"); //$NON-NLS-1$
  					it.newLine();
  					it.append("\t}"); //$NON-NLS-1$
  					it.newLineIfNotEmpty();
  					it.newLine();
  				}
  			});
  			if (enableAppenders) {
  				final String buildFunctionName = "build" + Strings.toFirstUpper(//$NON-NLS-1$
  						element.getElementDescription().getName());
  				final TypeReference appender = getCodeElementExtractor().getElementAppenderImpl(
  						element.getElementDescription().getName());
  				this.builderFactoryContributions.addContribution(new StringConcatenationClient() {
  					@Override
  					protected void appendTo(TargetStringConcatenation it) {
  						it.append("\t/** Create the appender for a " + getLanguageName() + " " //$NON-NLS-1$ //$NON-NLS-2$
  								+ element.getElementDescription().getElementType().getSimpleName() + "."); //$NON-NLS-1$
  						it.newLine();
  						it.append("\t * @param name the name of the " + element.getElementDescription().getName()); //$NON-NLS-1$
  						it.newLine();
  						it.append("\t * @param resourceSet the set of the resources that must be used for"); //$NON-NLS-1$
  						it.newLine();
  						it.append("\t *    containing the generated resource, and resolving types from names."); //$NON-NLS-1$
  						it.newLine();
  						it.append("\t * @return the appender."); //$NON-NLS-1$
  						it.newLine();
  						it.append("\t */"); //$NON-NLS-1$
  						it.newLine();
  						it.append("\t@"); //$NON-NLS-1$
  						it.append(Pure.class);
  						it.newLine();
  						it.append("\tpublic "); //$NON-NLS-1$
  						it.append(appender);
  						it.append(" "); //$NON-NLS-1$
  						it.append(buildFunctionName);
  						it.append("(String name, "); //$NON-NLS-1$
  						it.append(ResourceSet.class);
  						it.append(" resourceSet) {"); //$NON-NLS-1$
  						it.newLine();
  						it.append("\t\t"); //$NON-NLS-1$
  						it.append(appender);
  						it.append(" a = new "); //$NON-NLS-1$
  						it.append(appender);
  						it.append("("); //$NON-NLS-1$
  						it.append(createFunctionName);
  						it.append("(name, resourceSet));"); //$NON-NLS-1$
  						it.newLine();
  						it.append("\t\tgetInjector().injectMembers(a);"); //$NON-NLS-1$
  						it.newLine();
  						it.append("\t\treturn a;"); //$NON-NLS-1$
  						it.newLine();
  						it.append("\t}"); //$NON-NLS-1$
  						it.newLineIfNotEmpty();
  						it.newLine();
  						it.append("\t/** Create the appender for a " + getLanguageName() + " " //$NON-NLS-1$ //$NON-NLS-2$
  								+ element.getElementDescription().getElementType().getSimpleName() + "."); //$NON-NLS-1$
  						it.newLine();
  						it.append("\t * @param name the name of the " + element.getElementDescription().getName()); //$NON-NLS-1$
  						it.newLine();
  						it.append("\t * @param resource the resource that must be used for"); //$NON-NLS-1$
  						it.newLine();
  						it.append("\t *    containing the generated resource, and resolving types from names."); //$NON-NLS-1$
  						it.newLine();
  						it.append("\t * @return the appender."); //$NON-NLS-1$
  						it.newLine();
  						it.append("\t */"); //$NON-NLS-1$
  						it.newLine();
  						it.append("\t@"); //$NON-NLS-1$
  						it.append(Pure.class);
  						it.newLine();
  						it.append("\tpublic "); //$NON-NLS-1$
  						it.append(appender);
  						it.append(" "); //$NON-NLS-1$
  						it.append(buildFunctionName);
  						it.append("(String name, "); //$NON-NLS-1$
  						it.append(Resource.class);
  						it.append(" resource) {"); //$NON-NLS-1$
  						it.newLine();
  						it.append("\t\t"); //$NON-NLS-1$
  						it.append(appender);
  						it.append(" a = new "); //$NON-NLS-1$
  						it.append(appender);
  						it.append("("); //$NON-NLS-1$
  						it.append(createFunctionName);
  						it.append("(name, resource));"); //$NON-NLS-1$
  						it.newLine();
  						it.append("\t\tgetInjector().injectMembers(a);"); //$NON-NLS-1$
  						it.newLine();
  						it.append("\t\treturn a;"); //$NON-NLS-1$
  						it.newLine();
  						it.append("\t}"); //$NON-NLS-1$
  						it.newLineIfNotEmpty();
  						it.newLine();
  					}
  				});
  			}
  		}
  	}