docs: function(observableOrList, priority) {
  	// stores listeners for this patcher
  	this.handlers = new KeyTree([Object, Array], {
  		// call setup when the first handler is bound
  		onFirst: this.setup.bind(this),
  		// call teardown when the last handler is removed
  		onEmpty: this.teardown.bind(this)
  	});
  
  	// save this value observable or patch emitter (list)
  	this.observableOrList = observableOrList;
  	// if we were passed an observable value that we need to read its array for changes
  	this.isObservableValue = canReflect.isValueLike(this.observableOrList) || canReflect.isObservableLike(this.observableOrList);
  	if(this.isObservableValue) {
  	    this.priority = canReflect.getPriority(observableOrList);
  	} else {
  	    this.priority = priority || 0;
  	}
  	this.onList = this.onList.bind(this);
  	this.onPatchesNotify = this.onPatchesNotify.bind(this);
  	// needs to be unique so the derive queue doesn't only add one.
  	this.onPatchesDerive = this.onPatchesDerive.bind(this);
  
  	// stores patches that have happened between notification and
  	// when we queue the  `onPatches` handlers in the `domUI` queue
  	this.patches = [];
  
  
  	//!steal-remove-start
  	if(process.env.NODE_ENV !== 'production') {
  		Object.defineProperty(this.onList, "name", {
  			value: "live.list new list::"+canReflect.getName(observableOrList),
  		});
  		Object.defineProperty(this.onPatchesNotify, "name", {
  			value: "live.list notify::"+canReflect.getName(observableOrList),
  		});
  		Object.defineProperty(this.onPatchesDerive, "name", {
  			value: "live.list derive::"+canReflect.getName(observableOrList),
  		});
  	}
  	//!steal-remove-end
  }