function createFactory() {
    return function Stamp(...args) {
      let options = args[0];
      const descriptor = Stamp.compose || {};

      // Next line was optimized for most JS VMs. Please, be careful here!
      // The instance of this stamp
      let instance = descriptor.methods
        ? Object.create(descriptor.methods)
        : {};

      if (descriptor.deepProperties) merge(instance, descriptor.deepProperties);
      if (descriptor.properties) assign(instance, descriptor.properties);
      if (descriptor.propertyDescriptors)
        Object.defineProperties(instance, descriptor.propertyDescriptors);

      const inits = descriptor.initializers;
      // No initializers?
      if (!Array.isArray(inits) || inits.length === 0) return instance;

      // The spec. says that the first argument to every initializer must be an
      // empty object if nothing else was given when a stamp was called: Stamp()
      if (options === undefined) options = {};

      for (let i = 0, initializer, returnedValue; i < inits.length; ) {
        initializer = inits[i++];
        if (isFunction(initializer)) {
          returnedValue = initializer.call(instance, options, {
            instance,
            stamp: Stamp,
            args,
          });
          instance = returnedValue === undefined ? instance : returnedValue;
        }
      }

      return instance;
    };
  }
Creates new factory instance.
@returns {Function} The new factory function.