<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_xrefs(self, token):
 """Search token for +value+ and !variable! style references. Be careful to not xref a new variable. """

        out, end = [], 0
        token = token.replace("\\n", "\n")
        for m in re.finditer(self.xref_registry, token, re.VERBOSE | re.DOTALL):
            if m.start(0) > end:
                out.append(String(token[end:m.start(0)], self.current_obj))
            end = m.end(0)
            if m.group("type"):
                xref_type = {"+": ValueXRef,
                             "!": VariableXRef,
                             "@": ElementXRef}[m.group("type")]
                out.append(xref_type(m.group("xref"), self.current_obj))
            elif m.group("uri") is not None:
                path = m.group("uri")
                out.append(MetaURI(path, self.current_obj))
            elif m.group("repeat") is not None:
                repeat, separator, nodups = m.group("repeat", "separator", "nodups")
                if separator is None:
                    separator = ""
                if nodups is None:
                    nodups = ""
                out.append(MetaRepeat(self.parse_xrefs(repeat), separator, nodups, self.current_obj))
            elif m.group("block") is not None:
                path = m.group("block")
                out.append(MetaBlock(path, self.current_obj))
            elif m.group("choices") is not None:
                choices = m.group("choices")
                out.append(MetaChoice(choices, self.current_obj))
            else:
                startval, endval = m.group("start", "end")
                out.append(MetaRange(startval, endval, self.current_obj))
        if end < len(token):
            out.append(String(token[end:], self.current_obj))
        return out