function composeFormatters(aFormatters, fnRootFormatter) {
		var bRequiresIContext = aFormatters.some(function (fnFormatter) {
				return fnFormatter.requiresIContext; // Note: it's either true or missing here
			});

		function formatter(oInterface) {
			var i,
				n = aFormatters.length,
				aArguments = arguments,
				aResults = new Array(n);

			for (i = 0; i < n; i += 1) {
				if (aFormatters[i].requiresIContext) {
					aArguments = arguments;
				} else if (bRequiresIContext) { // drop oInterface
					aArguments = Array.prototype.slice.call(arguments, 1);
				}
				aResults[i] = aFormatters[i].apply(this, aArguments);
			}

			if (fnRootFormatter) {
				return fnRootFormatter.apply(this, aResults);
			}
			// @see sap.ui.model.CompositeBinding#getExternalValue
			// "default: multiple values are joined together as space separated list if no
			//  formatter or type specified"
			return n > 1 ? aResults.join(" ") : aResults[0];
		}

		if (bRequiresIContext) {
			formatter.requiresIContext = true;
		}
		// @see sap.ui.base.ManagedObject#_bindProperty
		formatter.textFragments = fnRootFormatter && fnRootFormatter.textFragments
			|| "sap.ui.base.BindingParser: composeFormatters";
		return formatter;
	}
Creates a composite formatter which calls <code>fnRootFormatter</code> on the results of the
given formatters, which in turn are called on the original arguments.

@param {function[]} aFormatters
  list of leaf-level formatters
@param {function} [fnRootFormatter]
  root level formatter; default: <code>Array.prototype.join(., " ")</code>
@return {function}
  a composite formatter