public IBasketLine CreateBasketLine(IBasket basket) {

            Basket b = basket as Basket;

            if (b != null) {
                BasketItem item = new BasketItem();
                item.Basket = b;
                return item;
            }

            return null;
        }
        public virtual void RemoveItem(string itemCode) {

            BasketItem[] clone = new BasketItem[BasketItemList.Count];
            BasketItemList.CopyTo(clone, 0);

            for (int i = 0; i < clone.Length; i++) {
                if (clone[i].ItemCode == itemCode) {
                    try {
                        BasketItemList.Remove(clone[i]);
                    } catch {}
                }
            }
        }
        public virtual IBasketLine UpdateItem(BasketItem item, string description, decimal price) {

            BasketItemList.Remove(item);
            item.Description = description;
            Money m = new Money(price);
            item.UnitLinePrice = item.LinePrice = item.TaxPrice = m;
            BasketItemList.Add(item);

            return item;
        }
        public virtual IBasketLine AddItem(BasketItemType itemType, string description, decimal price) {

            BasketItem item = new BasketItem();

            item.Basket = this;
            item.Quantity = 1;
            item.ItemType = itemType;
            item.Status = PricingStatus.OK;
            Money m = new Money(price);
            item.UnitLinePrice = m;
            
            BasketItemList.Add(item);

            return item;
        }
        public virtual IBasketLine AddItem(Product product, int quantity, BasketItemType itemType) {
            
            BasketItem item = new BasketItem();

            item.Basket = this;
            item.Product = product;
            item.Quantity = quantity;
            item.ItemType = itemType;

            BasketItemList.Add(item);

            return item;
        }
        //I don't like this. The item code version is much better.
        public virtual IBasketLine AddItem(Product product, System.Collections.Generic.IList<IAttributeSelection> optionList, int quantity) {

            BasketItem item = new BasketItem();
            item.Basket = this;
            item.Quantity = quantity;
            item.Product = product;

            if (optionList != null) {

                for (int i = 0; i < optionList.Count; i++) {

                    BasketItemAttribute attr = new BasketItemAttribute();
                    
                    attr.AttributeID = optionList[i].AttributeID;
                    attr.OptionValue = optionList[i].OptionValue;

                    item.OptionList.Add(attr);
                }
            }

            BasketItemList.Add(item);

            return item;
        }
        public IBasketLine UpdateItem(BasketItem item, string description, decimal price) {

            throw new Exception("The method or operation is not implemented.");
        }