public boolean add(Comparable obj)
	{
		// initalize sentinels
		current = parent = grand = header;
		
		// set item of nullNode
		nullNode.theItem = obj;

		// search for insertion point
		while (compare(obj, current) != 0)
		{
			// advance sentinels
			great = grand;
			grand = parent;
			parent = current;
			current = compare(obj, current) < 0 ? current.left : current.right;

			// fix balance if 2 red children
			if (current.left.color == RED && current.right.color == RED)
				balance(obj);
        }
        
		// insertion fails if item already present
		if (current != nullNode)
			throw new DuplicateItemException(obj.toString());
		
		// create new node
		current = new RedBlackNode(obj, nullNode, nullNode);

		// attach to parent
		if (compare(obj, parent) < 0)
			parent.left = current;
		else
			parent.right = current;

		// fix rule violations
		balance(obj);

		// update size
		theSize++;
		
		// indicate a modification has been made
		modCount++;
		
		// add successful
		return true;
	}