private void AttemptSwap(IDragContainer <T> destination, IDragContainer <T> source)
        {
            // Provisionally remove item from both sides.
            var removedSourceNumber      = source.GetNumber();
            var removedSourceItem        = source.GetItem();
            var removedSourceState       = source.GetModifiers();
            var removedDestinationNumber = destination.GetNumber();
            var removedDestinationItem   = destination.GetItem();
            var removedDestinationState  = destination.GetModifiers();

            source.RemoveItems(removedSourceNumber);
            destination.RemoveItems(removedDestinationNumber);

            var sourceTakeBackNumber      = CalculateTakeBack(removedSourceItem, removedSourceNumber, source, destination);
            var destinationTakeBackNumber = CalculateTakeBack(removedDestinationItem, removedDestinationNumber, destination, source);

            // Do take backs (if needed)
            if (sourceTakeBackNumber > 0)
            {
                source.AddItems(removedSourceItem, sourceTakeBackNumber, removedSourceState);
                removedSourceNumber -= sourceTakeBackNumber;
            }
            if (destinationTakeBackNumber > 0)
            {
                destination.AddItems(removedDestinationItem, destinationTakeBackNumber, removedSourceState);
                removedDestinationNumber -= destinationTakeBackNumber;
            }

            // Abort if we can't do a successful swap
            if (source.MaxAcceptable(removedDestinationItem) < removedDestinationNumber ||
                destination.MaxAcceptable(removedSourceItem) < removedSourceNumber)
            {
                destination.AddItems(removedDestinationItem, removedDestinationNumber, removedDestinationState);
                source.AddItems(removedSourceItem, removedSourceNumber, removedSourceState);
                return;
            }

            // If stack exists in inventory, send both items to destination to stack source and return destination
            if (destination.HasStack(removedSourceItem))
            {
                destination.AddItems(removedSourceItem, removedSourceNumber, removedSourceState);
                destination.AddItems(removedDestinationItem, removedDestinationNumber, removedDestinationState);
                return;
            }

            // Do swaps
            if (removedDestinationNumber > 0)
            {
                source.AddItems(removedDestinationItem, removedDestinationNumber, removedDestinationState);
            }
            if (removedSourceNumber > 0)
            {
                destination.AddItems(removedSourceItem, removedSourceNumber, removedSourceState);
            }
        }