code: function(space, type, path, value, index) {
  		// console.log('context notify downstream  : ', space, type, path, value, index);
  		space = space ||  this.map;
  		if (space._upstreams)
  			this.notifyUpstream(space, type, [], value, index);
  		if (space._listeners)
  			for (var i = 0, len = space._listeners.length; i < len; ++i) {
  				var listener = space._listeners[i];
  				if (!listener) {
  					// maybe it's because listeners length has change so update it 
  					// (probably some previous listener have removed some listeners through cascade)
  					len = space._listeners.length;
  					continue;
  				}
  				listener.call(this, value, type, path, index);
  			}
  		if (type !== 'push')
  			for (var j in space) {
  				if (j === '_listeners' || j === '_upstreams')
  					continue;
  				// recursion : 'set' with value[j] (if any) and path.concat(j). index = j;
  				this.notifyDownstream(space[j], 'set', path ? path.concat(j) : path, (value !== undefined && value !== null) ? value[j] : undefined, j);
  			}
  		return this;
  	}
docs: recursive notification from initial modification point to leaf.
  Normaly for internal use.