Extracts message informations from `data`.

        :param data: received line.
        :type data: unicode
        :return: extracted informations (source, destination, command, args).
        :rtype: tuple(Source, str, str, list)
        :raise: :class:`fatbotslim.irc.NullMessage` if `data` is empty.

def parse(cls, data):
        """
        Extracts message informations from `data`.

        :param data: received line.
        :type data: unicode
        :return: extracted informations (source, destination, command, args).
        :rtype: tuple(Source, str, str, list)
        :raise: :class:`fatbotslim.irc.NullMessage` if `data` is empty.
        """
        src = u''
        dst = None
        if data[0] == u':':
            src, data = data[1:].split(u' ', 1)
        if u' :' in data:
            data, trailing = data.split(u' :', 1)
            args = data.split()
            args.extend(trailing.split())
        else:
            args = data.split()
        command = args.pop(0)
        if command in (PRIVMSG, NOTICE):
            dst = args.pop(0)
            if ctcp_re.match(args[0]):
                args = args[0].strip(u'\x01').split()
                command = u'CTCP_' + args.pop(0)
        return Source(src), dst, command, args