/
CDC-1.1/
parent $foundation
object $environment

var $root child_index 0
var $root fertile 0
var $root manager $environment
var $root owned [$environment]
var $root owners [$environment]
var $root writable []
var $root readable ['parameters, 'methods, 'code]
var $root inited 1
var $root dbref 'environment

method environment
    return [];
.

method match_environment
    arg str;
    var obj, env, found, match;
    
    if (!str)
        throw(~objnf, "No \"\" in environment.", str);
    
    // Handle special cases.
    if (str == "me") {
        return this();
    } else if ((str[1]) == "$") {
        obj = (| get_name(tosym(substr(str, 2))) |);
        if (!valid(obj))
            throw(~objnf, "No such object " + str, str);
        return obj;
    } else {
        env = .environment();
        found = [];
        if (str in ["it", "him", "her"]) {
            match = (| sender().match_context(str) |);
            if (!match) {
                for obj in (env) {
                    if ((| obj.gender_context() |) == str)
                        found = [@found, [obj, 1]];
                }
            } else {
                found = [[match, 1]];
            }
        } else {
            for obj in (env) {
                match = obj.match_name(str);
                if (match)
                    found = found + [[obj, match]];
            }
            if (!found) {
                for obj in (env) {
                    match = obj.match_name_aliases(str);
                    if (match)
                        found = found + [[obj, match]];
                }
            }
        }
        if (!found)
            throw(~objnf, ("No \"" + str) + "\" in environment.", str);
        if (listlen(found) == 1) {
            return (found[1])[1];
        } else {
            match = $list.min(@$list.slice(found, 2));
            if (($list.count(match, $list.slice(found, 2))) == 1)
                return (found[match in ($list.slice(found, 2))])[1];
            else
                throw(~ambig, ("\"" + str) + "\" can match more than one object", [$list.slice(found, 1), str]);
        }
    }
.

method local_to_environment
    arg obj;
    
    return obj in (.environment());
.