mixed process_value(string func) {
    int tmp;
    string arg;
    object obj;
    mixed ret;

    if (!func || !stringp(func))
	return 0;

    if ((tmp = member_array('|', func)) != -1) {
	arg = func[tmp+1..];
	func = func[0..tmp-1];
    }
    if ((tmp = member_array(':', func)) != -1) {
	obj = find_object(func[tmp+1..]);
	func = func[0..tmp-1];
    } else {
	obj = previous_object();
    }
    if (!obj)
	return 0;

    return call_other(obj, func, explode(arg, "|")...);
}

string process_string(string str) {
    int pr_start;
    string array parts = explode(str, "@@");

    pr_start = !(str[0..1]=="@@");

    for (int il = pr_start; il < sizeof(parts); il += 2) {
	string tmp = process_value(parts[il]);
	if (stringp(tmp))
	    parts[il] = tmp;
    }

    return implode(parts, "");
}
