docs: function(attr){
  
  		if (attr === "./") {
  			attr = "this";
  		}
  
  		var info = {remainingKey: attr};
  
  		// handle scope stuff first
  		info.isScope = attr === "scope";
  		if(info.isScope) {
  			return info;
  		}
  		var firstSix = attr.substr(0, 6);
  		info.isInScope =
  			firstSix === "scope." ||
  			firstSix === "scope@";
  		if(info.isInScope) {
  			info.remainingKey = attr.substr(6);
  			return info;
  		} else if(firstSix === "scope/") {
  			info.walkScope = true;
  			info.remainingKey = attr.substr(6);
  			return info;
  		} else if(attr.substr(0, 7) === "@scope/") {
  			info.walkScope = true;
  			info.remainingKey = attr.substr(7);
  			return info;
  		}
  
  		info.parentContextWalkCount = 0;
  		// Searches for `../` and other context specifiers
  		info.remainingKey = attr.replace(parentContextSearch, function(token, parentContext, dotSlash, thisContext, index){
  			info.isContextBased = true;
  			if(parentContext !== undefined) {
  				info.parentContextWalkCount++;
  			}
  			return "";
  		});
  		// ../..
  		if(info.remainingKey === "..") {
  			info.parentContextWalkCount++;
  			info.remainingKey = "this";
  		}
  		else if(info.remainingKey === "." || info.remainingKey === "") {
  			info.remainingKey = "this";
  		}
  
  		if(info.remainingKey === "this") {
  			info.isContextBased = true;
  		}
  		return info;
  	}