docs: function(scope, key, options){
  
  	this.startingScope = scope;
  	this.key = key;
  	this.read = this.read.bind(this);
  	this.dispatch = this.dispatch.bind(this);
  
  	// special case debugger helper so that it is called with helperOtions
  	// when you do {{debugger}} as it already is with {{debugger()}}
  	if (key === "debugger") {
  		// prevent "Unable to find key" warning
  		this.startingScope = { _context: stacheHelpers };
  
  		this.read = function() {
  			var helperOptions = { scope: scope };
  			var debuggerHelper = stacheHelpers["debugger"];
  			return debuggerHelper(helperOptions);
  		};
  	}
  
  	//!steal-remove-start
  	if (process.env.NODE_ENV !== 'production') {
  		Object.defineProperty(this.read, "name", {
  			value: canReflect.getName(this) + ".read",
  		});
  		Object.defineProperty(this.dispatch, "name", {
  			value: canReflect.getName(this) + ".dispatch",
  		});
  	}
  	//!steal-remove-end
  
  	var observation = this.observation = new Observation(this.read, this);
  	this.options = assign({ observation: this.observation }, options);
  
  	// things added later
  	this.fastPath = undefined;
  	this.root = undefined;
  	this.reads = undefined;
  	this.setRoot = undefined;
  	// This is read by call expressions so it needs to be observable
  	this._thisArg = new SimpleObservable();
  	this.parentHasKey = undefined;
  	var valueDependencies = new Set();
  	valueDependencies.add(observation);
  	this.dependencies = {valueDependencies: valueDependencies};
  
  	// This is basically what .get() should give, but it
  	// isn't used to figure out the last value.
  	this._latestValue = undefined;
  }