docs: function setProp (obj, path, func) {
    var next;
    path = _.isString(path) ? path.split('.') : path;
  
    // We have more traversing to do
    if (path.length > 1) {
      next = path.shift();
      if (_.isArray(obj[next])) {
        obj[next].forEach(function (el, i) {
          setProp(obj[next][i], _.clone(path), func);
        });
      } else {
        if (!obj[next]) {
          obj[next] = {};
        }
        setProp(obj[next], _.clone(path), func);
      }
  
    // No more traversing. We can now target the final node with path[0]
    } else {
      next = path[0];
      // if we are at the end of the path and `obj` is an array
      if (_.isArray(obj)) {
        _.forEach(obj, function (el, i) {
          el = func(el);
        });
      } else {
        obj[next] = func(obj[next]);
      }
    }
  }