docs: function self(collector, container, level, fields, reverse) {
              fields = [].concat(fields || []);
  
              _.each(container, function(value, name) {
                  if (fields[0] && (name !== fields[0])) {
                      return;
                  }
  
                  if (level > 1 && _.isSimpleObject(value)) {
                      if (!(name in collector)) {
                          collector[name] = {};
                      }
                      self(collector[name], value, level-1, fields.slice(1));
                  } else if (reverse || (!(name in collector))) {
                      collector[name] = value;
                  }
              });
  
              return collector;
          }