docs: function(path, data, oldvalue, newvalue) {
      if(!path) return;
      
      // Create the dispatch strategy based on the modified paths, to avoid duplicate dispatch.
      // IMPORTANT: Deepest paths dispatch first.
      var dispatchQueue = [];
      // Use comparison function to get a full accounting for what has changed inside that scope
      var scopeModifications = SpahQL.DataHelper.compare(oldvalue, newvalue, path);    
      for(var modifiedPath in scopeModifications) {
        // Get the oldvalue, newvalue etc.
        var modificationData = scopeModifications[modifiedPath];
        
        // Push path and all uptree paths onto queue, ensuring uniqueness      
        var currentPath = modifiedPath;
        while(currentPath.lastIndexOf("/") >= 0) {
          if(dispatchQueue.indexOf(currentPath) < 0) dispatchQueue.push(currentPath);
          currentPath = (currentPath.lastIndexOf("/") == 0 && currentPath.length>1)? "/" : currentPath.substring(0, currentPath.lastIndexOf("/"));
        }
      }
      
      // Sort dispatch queue based on depth
      dispatchQueue.sort(function(a, b) {
        // Count slashes
        if(a == "/") return 1;
        if(b == "/") return -1;
        return (a.split("/").length > b.split("/").length)? -1: 1;
      })
      SpahQL.log("Path modified on data store, formulated the following dispatch strategy: ["+dispatchQueue.join(" -> ")+"]. Data store: ", data);
      
      // Now run the dispatch queue
      // For each path with modifications in the dispatch queue, locate all modified
      // subpaths in the modification list.
      
      for(var i=0; i<dispatchQueue.length; i++) {
        var dispatchPath = dispatchQueue[i];
        var pathCallbacks = this.callbacks[dispatchPath];
        
        SpahQL.log("Triggering registered path callbacks for "+dispatchPath+": "+((!pathCallbacks)? "No callbacks to trigger" : pathCallbacks.length+" callbacks to trigger"));
        
        if(pathCallbacks) {
          for(var j=0; j<pathCallbacks.length; j++) {
            if(pathCallbacks[j][0] == data) {
              // Find subpaths
              var modifiedSubPaths = [];
              for(var k=0; k<dispatchQueue.length; k++) {
                if(dispatchQueue[k] != dispatchPath && (dispatchQueue[k]).indexOf(dispatchPath) == 0) {
                  modifiedSubPaths.push(
                    dispatchQueue[k].substring(dispatchPath.length)
                  );
                }
              }
              // Trigger callback
              (pathCallbacks[j][1])(SpahQL.select(dispatchPath, data), dispatchPath, modifiedSubPaths);
            }
          }
        }
      }
    }