forIn = function(collection, callback, thisArg) {
      var index, iterable = collection, result = iterable;
      if (!iterable) return result;
      if (!objectTypes[typeof iterable]) return result;
      callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3);
        for (index in iterable) {
          if (callback(iterable[index], index, collection) === false) return result;
        }
      return result
    }
Iterates over own and inherited enumerable properties of an object,
executing the callback for each property. The callback is bound to `thisArg`
and invoked with three arguments; (value, key, object). Callbacks may exit
iteration early by explicitly returning `false`.

@static
@memberOf _
@type Function
@category Objects
@param {Object} object The object to iterate over.
@param {Function} [callback=identity] The function called per iteration.
@param {*} [thisArg] The `this` binding of `callback`.
@returns {Object} Returns `object`.
@example

function Shape() {
  this.x = 0;
  this.y = 0;
}

Shape.prototype.move = function(x, y) {
  this.x += x;
  this.y += y;
};

_.forIn(new Shape, function(value, key) {
  console.log(key);
});
// => logs 'x', 'y', and 'move' (property order is not guaranteed across environments)