def code128(self, data, **kwargs):
        """Renders given ``data`` as **Code 128** barcode symbology.

        :param str codeset: Optional. Keyword argument for the subtype (code
            set) to render. Defaults to :attr:`escpos.barcode.CODE128_A`.

        .. warning::

            You should draw up your data according to the subtype (code set).
            The default is **Code 128 A** and there is no way (yet) to mix code
            sets in a single barcode rendering (at least not uniformly).

            Implementations may simply ignore the code set.

        """
        if not re.match(r'^[\x20-\x7F]+$', data):
            raise ValueError('Invalid Code 128 symbology. Code 128 can encode '
                    'any ASCII character ranging from 32 (20h) to 127 (7Fh); '
                    'got {!r}'.format(data))
        codeset = kwargs.pop('codeset', barcode.CODE128_A)
        barcode.validate_barcode_args(**kwargs)
        return self._code128_impl(data, codeset=codeset, **kwargs)