/
ColdCore-3.0a9.02/
ColdCore-3.0a9.02/src/
new object $interface_registry: $db;

var $db database = #[['object, [$page_bin_index]], ['help, [$page_bin_index]], ['display, [$page_bin_index]], ['describe, [$page_bin_index]], ['who, [$page_bin_index]], ['read, [$note]], ['method, [$page_bin_index]], ['generate, [$page_login]], ['submit_new, [$page_web_prefs]]];
var $dmi_data descriptions = #[];
var $root created_on = 858198912;
var $root flags = ['variables, 'methods, 'code, 'core];
var $root inited = 1;
var $root managed = [$interface_registry];
var $root manager = $interface_registry;

private method ._add_method_to_index() {
    arg object, method;
    var old_method_index, new_method_index;
    
    old_method_index = (| .exact_match(method) |) || [];
    new_method_index = ($graph.topological_sort(old_method_index.setadd(object), 'has_ancestor)).reverse();
    .insert(method, new_method_index);
};

private method ._del_method_from_index() {
    arg object, method;
    var old_method_index, new_method_index;
    
    old_method_index = (| .exact_match(method) |) || [];
    new_method_index = ($graph.topological_sort(old_method_index.setremove(object), 'has_ancestor)).reverse();
    if (new_method_index)
        .insert(method, new_method_index);
    else
        .remove(method);
};

private method ._find_object_in_index() {
    arg object, method, @second_time;
    var iter, objectlist;
    
    [(second_time ?= 0)] = second_time;
    if (second_time)
        ._sort_method_index(method);
    objectlist = (| .exact_match(method) |) || throw(~matchnf, "That method is not listed in the Interface Registry.");
    if (object in objectlist) {
        return valid(object) ? object : (> ._find_object_in_index(object, method, 1) <);
    } else {
        for iter in (objectlist) {
            if (object.has_ancestor(iter))
                return valid(iter) ? iter : (> ._find_object_in_index(object, method, 1) <);
        }
    }
    throw(~matchnf, "Object doesn't define that method in the Interface Registry");
};

public method ._sort_method_index() {
    arg method;
    var old_method_index, new_method_index, item;
    
    old_method_index = (| .exact_match(method) |) || [];
    new_method_index = filter item in (old_method_index) where (valid(item));
    new_method_index = ($graph.topological_sort(new_method_index, 'has_ancestor)).reverse();
    .insert(method, new_method_index);
};

public method .add_description() {
    arg object, method, description;
    
    if (!(object.has_ancestor($dmi_data)))
        throw(~invrequest, object + " must be a child of $dmi_data.");
    (> ._add_method_to_index(object, method) <);
    (> object.add_description_to_db(method, description) <);
};

root method .core_interface_registry() {
    var method;
    
    for method in ((.database()).keys())
        ._sort_method_index(method);
};

public method .del_description() {
    arg object, method;
    
    (> ._del_method_from_index(object, method) <);
    (> object.del_description_from_db(method) <);
};

public method .describe() {
    arg object, method;
    var defining_object;
    
    defining_object = (> ._find_object_in_index(object, method) <);
    return (> defining_object.describe_method(method) <);
};

public method .index() {
    return .database();
};

public method .verbal_index() {
    var index, method, objects, object, item, lines;
    
    index = .index();
    lines = ["Interface registry is tracking:{br}{br}"];
    lines += ["{table cols=50%,50%:"];
    for item in (index) {
        [method, objects] = item;
        lines += [((("{tr:{td:" + method) + "}{td:") + (objects.to_english())) + "}}"];
    }
    lines += ["}"];
    return $compiler.compile_cml(lines);
};

public method .where_is() {
    arg object, method;
    
    return (> ._find_object_in_index(object, method) <);
};