code: function createIterator() {
      var data = getObject();
  
      // data properties
      data.shadowedProps = shadowedProps;
      // iterator options
      data.array = data.bottom = data.loop = data.top = '';
      data.init = 'iterable';
      data.useHas = true;
      data.useKeys = !!keys;
  
      // merge options into a template data object
      for (var object, index = 0; object = arguments[index]; index++) {
        for (var key in object) {
          data[key] = object[key];
        }
      }
      var args = data.args;
      data.firstArg = /^[^,]+/.exec(args)[0];
  
      // create the function factory
      var factory = Function(
          'errorClass, errorProto, hasOwnProperty, isArguments, isArray, ' +
          'isString, keys, lodash, objectProto, objectTypes, nonEnumProps, ' +
          'stringClass, stringProto, toString',
        'return function(' + args + ') {\n' + iteratorTemplate(data) + '\n}'
      );
  
      releaseObject(data);
  
      // return the compiled function
      return factory(
        errorClass, errorProto, hasOwnProperty, isArguments, isArray,
        isString, keys, lodash, objectProto, objectTypes, nonEnumProps,
        stringClass, stringProto, toString
      );
    }
docs: /*-------------------------------------------------------------------------- 
  Creates compiled iteration functions.
  
  @private
  @param {Object} [options1, options2, ...] The compile options object(s).
  array - A string of code to determine if the iterable is an array or array-like.
  useHas - A boolean to specify using `hasOwnProperty` checks in the object loop.
  useKeys - A boolean to specify using `_.keys` for own property iteration.
  args - A string of comma separated arguments the iteration function will accept.
  top - A string of code to execute before the iteration branches.
  loop - A string of code to execute in the object loop.
  bottom - A string of code to execute after the iteration branches.
  @returns {Function} Returns the compiled function.