docs: function (obj, filter) {
      var result = {};
  
      var walk = function (obj, filter, result, path, originObj) {
          var elem
              , arrResult;
          if (!originObj) {
              var originObj = obj;
          }
          if (!path) {
              path = '';
          }
          if (_.isObject(obj) && !_.isRegExp(obj) && !_.isFunction(obj)) {
  
              if (_.isEmpty(obj)) {
                  result[path] = {}
              }
              else {
  
                  for (var value in obj) {
                      if (_.isObject(obj[value]) && !_.isRegExp(obj[value]) && !_.isFunction(obj[value]) && value != 'public' && value != 'virtual' && value != 'allow' && value != 'deny' && value != 'convert') {
                          if (_.isArray(obj[value])) {
  
                              //Check if empty array
                              if (_.isEmpty((obj[value]))) {
  
                                  if (_.isEmpty(path)) {
                                      elem = value;
                                  }
                                  else {
                                      elem = path + '.' + value + '';
                                  }
  
                                  if (!result[elem]) {
                                      result[elem] = [];
                                  }
                              }
                              else {
                                  //Check child elements of array
                                  for (var thisArrayElem in obj[value]) {
                                      if (_.isEmpty(path)) {
                                          elem = value;
                                      }
                                      else {
                                          elem = path + '.' + value + ''; //This is somehow not correct
                                      }
                                      if (!result[elem]) {
                                          result[elem] = [];
                                      }
                                      arrResult = find(obj[value][thisArrayElem], filter);
                                      if (arrResult) {
                                          (result[elem]).push(arrResult);
                                      }
  
                                  }
                              }
                          }
                          else {
  
                              var subPath = _.isEmpty(path) ? value : path + '.' + value + '';
  
                              if (!filter || value == filter) {
                                  if (path == '') {
                                      try {
                                          result[value] = eval('originObj' + generateObjectPath(value) + '');
                                      } catch (e) {
                                      }
                                  }
                                  else {
                                      try {
                                          result[path] = eval('originObj' + generateObjectPath(path) + '');
                                      } catch (e) {
                                      }
                                  }
                              }
  
                              result = walk(obj[value], filter, result, subPath, originObj);
                          }
                      }
                      else {
  
                          if (!filter || value == filter) {
                              if (path == '') {
                                  try {
                                      result[value] = eval('originObj' + generateObjectPath(value) + '');
                                  } catch (e) {
                                  }
                              }
                              else {
                                  try {
                                      result[path] = eval('originObj' + generateObjectPath(path) + '');
                                  } catch (e) {
                                  }
                              }
                          }
  
                      }
                  }
              }
          }
  
          return result;
      };
  
      var resultArray = walk(obj, filter, result);
      return _.isEmpty(resultArray) ? false : resultArray;
  }