 		}
 		
 		protected var _typeRestriction:Class;
+		private var _root:ILinkableObject; // the root object to which targetPath is relative
 		private var _target:ILinkableObject; // the current target or ancestor of the to-be-target
 		private var _foundRoot:Boolean = false; // false until Weave.getWeave() or Weave.getRoot(this) returns non-null
 		private var _foundTarget:Boolean = true; // false when _target is not the desired target

		{
			_targetPath = null;
			_target = null;
			// everything else will be cleaned up automatically
		}
		

		private var _warned:Boolean = false; // true after warning has been shown
		
		/**
		 * This is the root object to which targetPath is relative.
		 */
		public function get root():ILinkableObject
		{
			if (!_root)
			{
				var weave:Weave = Weave.getWeave(this);
				_root = weave ? weave.root : Weave.getRoot(this);
				
				if (_root && !_foundRoot && !_foundTarget)
					handlePath();
			}
			return _root;
		}
		public function set root(object:ILinkableObject):void
		{
			if (root != object)
			{
				var cc:ICallbackCollection = Weave.getCallbacks(this);
				cc.delayCallbacks();
				
				_root = object;
				if (_targetPath)
				{
					resetPathDependencies();
					handlePath();
				}
				cc.triggerCallbacks();
				
				cc.resumeCallbacks();
			}
		}
		
		/**
		 * This is the linkable object currently being watched.
		 * Setting this will unset the targetPath.
		 */
		public function get target():ILinkableObject
		{
			if (!_foundRoot && !_foundTarget)
