/// <summary>
        /// Add a `GameObject` to the first open slot.
        /// Expects `GameObject` to have a `Draggable`
        /// component attached.
        /// </summary>
        /// <param name="item">The `GameObject` item to add to
        /// this container</param>
        public override void Add(GameObject item)
        {
            Draggable dragHandler = item.GetComponent <Draggable>();

            if (dragHandler == null)
            {
                throw new MissingComponentException("Adding to Container requires `Draggable` component");
            }

            Stackable stackHandler = item.GetComponent <Stackable>();
            Slot      emptySlot = null, stackableSlot = null;

            foreach (Slot slot in Slots)
            {
                //  retrieve the first empty slot and retain
                if (emptySlot == null && slot.Item == null)
                {
                    emptySlot = slot;

                    //  if there's an item in this slot
                    //  but the item being added is stackable
                    //  check if it can stack
                }
                else if (slot.Item && stackHandler != null)
                {
                    Stackable itemStack = slot.Item.GetComponent <Stackable>();

                    if (itemStack != null && itemStack.CanStack(stackHandler))
                    {
                        stackableSlot = slot;
                    }
                }
            }

            //  add the item to the slot
            //  will prioritize stackable slot
            if (stackableSlot != null)
            {
                stackableSlot.AddItem(dragHandler);
            }
            else if (emptySlot != null)
            {
                emptySlot.AddItem(dragHandler);
            }

            throw new NotStackableException("Unable to add item (" + dragHandler.name + ") to container ( " + name + ")");
        }