public virtual void ClobberingAddChild(FileSystemObject child, FileSystemObject victim, EventTracker tracker)
        {
            if (children == null)
            {
                throw new Exception("Can't add a child to " + Uri.ToString());
            }
            if (child.parent != null)
            {
                throw new Exception("Can't add parented child " + child.Uri.ToString() + " to " + Uri.ToString());
            }
            if (victim.parent != this)
            {
                throw new Exception("Victim " + victim.Uri.ToString() + " is not a child of " + Uri.ToString());
            }
            if (child.Extension != victim.Extension)
            {
                throw new Exception("Extension mismatch: " + child.Extension + " vs. " + victim.Extension);
            }

            victim.parent         = null;
            child.parent          = this;
            child.id              = victim.id;
            child.base_name       = victim.base_name;
            child.name            = null;
            children [child.Name] = child;

            if (IsRooted)
            {
                child.AddOnDisk(tracker);
            }
        }
        public virtual void AddChild(FileSystemObject child, EventTracker tracker)
        {
            if (children == null)
            {
                throw new Exception("Can't add a child to " + Uri.ToString());
            }
            if (child.parent != null)
            {
                throw new Exception("Can't add parented child " + child.Uri.ToString() + " to " + Uri.ToString());
            }

            // FIXME: Need to handle the case of the added child
            // clobbering another w/ the same name.

            child.parent          = this;
            children [child.Name] = child;

            if (IsRooted)
            {
                child.AddOnDisk(tracker);
            }
        }
		public virtual void ClobberingAddChild (FileSystemObject child, FileSystemObject victim, EventTracker tracker)
		{
			if (children == null)
				throw new Exception ("Can't add a child to " + Uri.ToString ());
			if (child.parent != null)
				throw new Exception ("Can't add parented child " + child.Uri.ToString () + " to " + Uri.ToString ());
			if (victim.parent != this)
				throw new Exception ("Victim " + victim.Uri.ToString () + " is not a child of " + Uri.ToString ());
			if (child.Extension != victim.Extension)
				throw new Exception ("Extension mismatch: " + child.Extension + " vs. " + victim.Extension);

			victim.parent = null;
			child.parent = this;
			child.id = victim.id;
			child.base_name = victim.base_name;
			child.name = null;
			children [child.Name] = child;

			if (IsRooted)
				child.AddOnDisk (tracker);
		}
		public virtual void AddChild (FileSystemObject child, EventTracker tracker)
		{
			if (children == null)
				throw new Exception ("Can't add a child to " + Uri.ToString ());
			if (child.parent != null)
				throw new Exception ("Can't add parented child " + child.Uri.ToString () + " to " + Uri.ToString ());

			// FIXME: Need to handle the case of the added child
			// clobbering another w/ the same name.

			child.parent = this;
			children [child.Name] = child;
			
			if (IsRooted)
				child.AddOnDisk (tracker);
		}