function createIterator() {
    var object,
        prop,
        value,
        index = -1,
        length = arguments.length;

    // merge options into a template data object
    var data = {
      'bottom': '',
      'exit': '',
      'init': '',
      'top': '',
      'arrayBranch': { 'beforeLoop': '' },
      'objectBranch': { 'beforeLoop': '' }
    };

    while (++index < length) {
      object = arguments[index];
      for (prop in object) {
        value = (value = object[prop]) == null ? '' : value;
        // keep this regexp explicit for the build pre-process
        if (/beforeLoop|inLoop/.test(prop)) {
          if (typeof value == 'string') {
            value = { 'array': value, 'object': value };
          }
          data.arrayBranch[prop] = value.array || '';
          data.objectBranch[prop] = value.object || '';
        } else {
          data[prop] = value;
        }
      }
    }
    // set additional template `data` values
    var args = data.args,
        firstArg = /^[^,]+/.exec(args)[0],
        useStrict = data.useStrict;

    data.firstArg = firstArg;
    data.hasDontEnumBug = hasDontEnumBug;
    data.isKeysFast = isKeysFast;
    data.noArgsEnum = noArgsEnum;
    data.shadowed = shadowed;
    data.useHas = data.useHas !== false;
    data.useStrict = useStrict == null ? isStrictFast : useStrict;

    if (data.noCharByIndex == null) {
      data.noCharByIndex = noCharByIndex;
    }
    if (!data.exit) {
      data.exit = 'if (!' + firstArg + ') return result';
    }
    if (firstArg != 'collection' || !data.arrayBranch.inLoop) {
      data.arrayBranch = null;
    }
    // create the function factory
    var factory = Function(
        'arrayLikeClasses, ArrayProto, bind, compareAscending, concat, forIn, ' +
        'hasOwnProperty, identity, indexOf, isArguments, isArray, isFunction, ' +
        'isPlainObject, iteratorBind, objectClass, objectTypes, nativeKeys, ' +
        'propertyIsEnumerable, slice, stringClass, toString',
      'var callee = function(' + args + ') {\n' + iteratorTemplate(data) + '\n};\n' +
      'return callee'
    );
    // return the compiled function
    return factory(
      arrayLikeClasses, ArrayProto, bind, compareAscending, concat, forIn,
      hasOwnProperty, identity, indexOf, isArguments, isArray, isFunction,
      isPlainObject, iteratorBind, objectClass, objectTypes, nativeKeys,
      propertyIsEnumerable, slice, stringClass, toString
    );
  }
Creates compiled iteration functions. The iteration function will be created
to iterate over only objects if the first argument of `options.args` is
"object" or `options.inLoop.array` is falsey.

@private
@param {Object} [options1, options2, ...] The compile options objects.

 useHas - A boolean to specify whether or not to use `hasOwnProperty` checks
  in the object loop.

 useStrict - A boolean to specify whether or not to include the ES5
  "use strict" directive.

 args - A string of comma separated arguments the iteration function will
  accept.

 init - A string to specify the initial value of the `result` variable.

 exit - A string of code to use in place of the default exit-early check
  of `if (!arguments[0]) return result`.

 top - A string of code to execute after the exit-early check but before
  the iteration branches.

 beforeLoop - A string or object containing an "array" or "object" property
  of code to execute before the array or object loops.

 inLoop - A string or object containing an "array" or "object" property
  of code to execute in the array or object loops.

 bottom - A string of code to execute after the iteration branches but
  before the `result` is returned.

@returns {Function} Returns the compiled function.