<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 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