def METHOD_NAME(self, text, subvars={},
               trim_leading_lf=None, checkmissing=None):
    '''substitute variables in a string'''
    if trim_leading_lf is None:
        trim_leading_lf = self.trim_leading_lf
    if checkmissing is None:
        checkmissing = self.checkmissing
    # handle repititions
    while True:
        subidx = text.find(self.start_rep_token)
        if subidx == -1:
            break
        endidx = self.find_rep_end(text[subidx:])
        if endidx == -1:
            raise MAVParseError("missing end macro in %s" % text[subidx:])
        part1 = text[0:subidx]
        part2 = text[subidx+len(self.start_rep_token):subidx+(endidx-len(self.end_rep_token))]
        part3 = text[subidx+endidx:]
        a = part2.split(':')
        field_name = a[0]
        rest = ':'.join(a[1:])
        v = None
        if isinstance(subvars, dict):
            v = subvars.get(field_name, None)
        else:
            v = getattr(subvars, field_name, None)
        if v is None:
            raise MAVParseError('unable to find field %s' % field_name)
        t1 = part1
        for f in v:
            t1 += self.METHOD_NAME(rest, f, trim_leading_lf=False, checkmissing=False)
        if len(v) != 0 and t1[-1] in ["\n", ","]:
            t1 = t1[:-1]
        t1 += part3
        text = t1
    if trim_leading_lf:
        if text[0] == '\n':
            text = text[1:]
    while True:
        idx = text.find(self.start_var_token)
        if idx == -1:
            return text
        endidx = text[idx:].find(self.end_var_token)
        if endidx == -1:
            raise MAVParseError('missing end of variable: %s' % text[idx:idx+10])
        varname = text[idx+2:idx+endidx]
        if isinstance(subvars, dict):
            if not varname in subvars:
                if checkmissing:
                    raise MAVParseError("unknown variable in '%s%s%s'" % (
                        self.start_var_token, varname, self.end_var_token))
                return text[0:idx+endidx] + self.METHOD_NAME(text[idx+endidx:], subvars,
                                                            trim_leading_lf=False, checkmissing=False)
            value = subvars[varname]
        else:
            value = getattr(subvars, varname, None)
            if value is None:
                if checkmissing:
                    raise MAVParseError("unknown variable in '%s%s%s'" % (
                        self.start_var_token, varname, self.end_var_token))
                return text[0:idx+endidx] + self.METHOD_NAME(text[idx+endidx:], subvars,
                                                            trim_leading_lf=False, checkmissing=False)
        text = text.replace("%s%s%s" % (self.start_var_token, varname, self.end_var_token), str(value))
    return text