docs: function (scope, key) {
                      if (!key) {
                          key = scope;
                          scope = this;
                      }
  
                      if (!key) {
                          return null;
                      }
  
                      var path;
  
                      // if we have a path object
                      if (_.isArray(key)) {
                          path = key;
                          // path element
                      } else if (_.isObject(key)) {
                          path = [key];
                      } else {
                          path = Parser.parse(key, RULE_PATH);
                      }
  
                      var pathElement, val,
                          parameters, fnc,
                          newParameters;
                      for (var j = 0; j < path.length; j++) {
                          if (scope == null) {
                              return undefined;
                          } else {
                              pathElement = path[j];
                              if (pathElement.type == "fnc") {
                                  fnc = scope[pathElement.name];
                                  parameters = pathElement.parameter;
                                  newParameters = [];
                                  for (var i = 0; i < parameters.length; i++) {
                                      var param = parameters[i];
  
                                      if (_.isArray(param)) {
                                          param = this.get(param);
                                      } else if (_.isObject(param) && param.type && param.path) {
                                          param = this.get(param.path);
                                      }
                                      newParameters.push(param);
                                  }
                                  scope = fnc.apply(scope, newParameters);
                              } else if (pathElement.type == "var") {
                                  if (scope instanceof Bindable) {
                                      if (path.length - 1 === j) {
                                          val = scope.$[pathElement.name];
                                          if (_.isUndefined(val)) {
                                              val = scope[pathElement.name];
                                          }
                                          scope = val;
                                      } else {
                                          scope = scope.get(pathElement.name);
                                      }
  
                                  } else {
                                      scope = scope[pathElement.name];
                                  }
                              }
  
                              if (scope && pathElement.index != null) {
                                  // if it's an array
                                  if (_.isArray(scope)) {
                                      scope = scope[pathElement.index];
                                      // if it's a list
                                  } else if (scope.at) {
                                      scope = scope.at(pathElement.index);
                                  }
                              }
                          }
                      }
                      return scope;
                  }