Method code for $parse_lib.ref()

[Turn on line numbering]
arg str, @args;
var def, me, obj, reg, member, match, type, second;

[(me ?= sender())] = args;
if (args.length() > 1)
    match = args[2];
else
    match = [me, 'match_environment, []];
if (str == ".") {
    obj = (> match[1].(match[2])(".") <);
    return ['object, obj, obj, 0, 0];
}
if ((reg = regexp(str, "^(.*)<([^>]*)>(.*)$"))) {
    def = (> match[1].(match[2])(reg[2], @match[3]) <);
    str = reg[1] + reg[3];
}
if ((reg = regexp(str, "([^\.,]*)([\.,]+)([^\( ]*)"))) {
    obj = reg[1];
    member = reg[3];
    type = reg[2];
    if (type.length() > 1 && type[1] == "." && !obj) {
        type = type.subrange(2);
        obj = (> match[1].(match[2])(".") <);
    } else {
        obj = obj ? (> match[1].(match[2])(obj, @match[3]) <) : me;
    }
    if ("." in type) {
        if ("," in type)
            second = 'variable;
        type = 'method;
    } else {
        type = 'variable;
    }
} else {
    obj = (> match[1].(match[2])(str, @match[3]) <);
    type = 'object;
}
return [type, obj, def || obj, member, second];

// Created 27-Mar-1995 as a part of ColdCore, see: @help Credit

Tlon