function createIterator() {
      // data properties
      iteratorData.shadowedProps = shadowedProps;

      // iterator options
      iteratorData.array = iteratorData.bottom = iteratorData.loop = iteratorData.top = '';
      iteratorData.init = 'iterable';
      iteratorData.useHas = true;

      // merge options into a template data object
      for (var object, index = 0; object = arguments[index]; index++) {
        for (var key in object) {
          iteratorData[key] = object[key];
        }
      }
      var args = iteratorData.args;
      iteratorData.firstArg = /^[^,]+/.exec(args)[0];

      // create the function factory
      var factory = Function(
          'baseCreateCallback, errorClass, errorProto, hasOwnProperty, ' +
          'indicatorObject, isArguments, isArray, isString, keys, objectProto, ' +
          'objectTypes, nonEnumProps, stringClass, stringProto, toString',
        'return function(' + args + ') {\n' + iteratorTemplate(iteratorData) + '\n}'
      );

      // return the compiled function
      return factory(
        baseCreateCallback, errorClass, errorProto, hasOwnProperty,
        indicatorObject, isArguments, isArray, isString, iteratorData.keys, objectProto,
        objectTypes, nonEnumProps, stringClass, stringProto, toString
      );
    }
Creates compiled iteration functions.

@private
@param {...Object} [options] The compile options object(s).
@param {string} [options.array] Code to determine if the iterable is an array or array-like.
@param {boolean} [options.useHas] Specify using `hasOwnProperty` checks in the object loop.
@param {Function} [options.keys] A reference to `_.keys` for use in own property iteration.
@param {string} [options.args] A comma separated string of iteration function arguments.
@param {string} [options.top] Code to execute before the iteration branches.
@param {string} [options.loop] Code to execute in the object loop.
@param {string} [options.bottom] Code to execute after the iteration branches.
@returns {Function} Returns the compiled function.