docs: function _gpfEnumeratorEach (enumerator, callback, eventsHandler) {
      var iEnumerator = _gpfI.query(enumerator, _gpfI.IEnumerator),
          process;
      function end (event) {
          _gpfEventsFire.call(enumerator, event, {}, eventsHandler);
      }
      if (1 < callback.length) {
          process = function (event) {
              if (gpf.events.EVENT_CONTINUE === event.type) {
                  if (!iEnumerator.moveNext(process)) {
                      return;
                  }
              } else if (gpf.events.EVENT_STOP === event.type) {
                  return end(gpf.events.EVENT_STOPPED);
              } else if (gpf.events.EVENT_DATA !== event.type) {
                  return end(event.type);
              }
              callback(iEnumerator.current(), process);
          };
          if (iEnumerator.moveNext(process)) {
              callback(iEnumerator.current(), process);
          }
  
      } else {
          process = function (event) {
              if (gpf.events.EVENT_DATA !== event.type) {
                  return end(event);
              }
              do {
                  callback(iEnumerator.current());
              } while (iEnumerator.moveNext(process));
          };
          while (iEnumerator.moveNext(process)) {
              callback(iEnumerator.current());
          }
      }
  }