def _parseHashEntry(self, hash_entry):
        hashes = {}
        metadata = {}
        while True:
            if not hash_entry:
                break
            has_metadata = False
            header, hash_entry = hash_entry.split('\n', 1)
            opts = header.split(':')
            if len(opts) == 4:
                if opts[3] == 'm':
                    has_metadata = True
                else:
                    raise RuntimeError('Failed to parse full hash entry header "%s"' % header)
            list_name = opts[0]
            entry_len = int(opts[1])
            entry_count = int(opts[2])
            hash_strings = []
            metadata_strings = []
            for i in xrange(entry_count):
                hash_string = hash_entry[entry_len*i:entry_len*(i+1)]
                hash_strings.append(hash_string)
            hash_entry =  hash_entry[entry_count * entry_len:]
            if has_metadata:
                for i in xrange(entry_count):
                    next_metadata_len, hash_entry = hash_entry.split('\n', 1)
                    next_metadata_len = int(next_metadata_len)
                    metadata_str = hash_entry[:next_metadata_len]
                    metadata_strings.append(metadata_str)
                    hash_entry = hash_entry[next_metadata_len:]
            elif hash_entry:
                raise RuntimeError('Hash length does not match header declaration (no metadata)')
            hashes[list_name] = hash_strings
            metadata[list_name] = metadata_strings
        return hashes, metadata
Adds a parse callback, to be invoked when option parsing is done.
dataset/ETHPy150Open afilipovich/gglsbl/gglsbl/protocol.py/FullHashProtocolClient._parseHashEntry--crossover with--dataset/ETHPy150Open D-L/SimpleBookMarks/src/tornado/options.py/add_parse_callback