CartAdd.
        :param items:
            A dictionary containing the items to be added to the cart.
            Or a list containing these dictionaries.
            It is not possible to create an empty cart!
            example: [{'offer_id': 'rt2ofih3f389nwiuhf8934z87o3f4h',
            'quantity': 1}]
        :param CartId: Id of Cart
        :param HMAC: HMAC of Cart, see CartCreate for more info
        :return:
            An :class:`~.AmazonCart`.

def cart_add(self, items, CartId=None, HMAC=None, **kwargs):
        """CartAdd.
        :param items:
            A dictionary containing the items to be added to the cart.
            Or a list containing these dictionaries.
            It is not possible to create an empty cart!
            example: [{'offer_id': 'rt2ofih3f389nwiuhf8934z87o3f4h',
            'quantity': 1}]
        :param CartId: Id of Cart
        :param HMAC: HMAC of Cart, see CartCreate for more info
        :return:
            An :class:`~.AmazonCart`.
        """
        if not CartId or not HMAC:
            raise CartException('CartId and HMAC required for CartAdd call')

        if isinstance(items, dict):
            items = [items]

        if len(items) > 10:
            raise CartException("You can't add more than 10 items at once")

        offer_id_key_template = 'Item.{0}.OfferListingId'
        quantity_key_template = 'Item.{0}.Quantity'

        for i, item in enumerate(items):
            kwargs[offer_id_key_template.format(i)] = item['offer_id']
            kwargs[quantity_key_template.format(i)] = item['quantity']

        response = self.api.CartAdd(CartId=CartId, HMAC=HMAC, **kwargs)
        root = objectify.fromstring(response)

        new_cart = AmazonCart(root)
        self._check_for_cart_error(new_cart)

        return new_cart