/
CDC-1.2b/
CDC-1.2b/src/
parent $foundation
object $old_has_settings

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

method setting_templates
    (> .perms(sender()) <);
    return setting_templates || #[];
.

method all_setting_templates
    var obj, tmpl, out;
    
    (> .perms(sender()) <);
    out = #[];
    for obj in (.ancestors()) {
        tmpl = (| obj.setting_templates() |);
        if (tmpl)
            out = dict_add(out, obj, tmpl);
        if (obj == definer())
            break;
    }
    return out;
.

method add_setting_template
    arg template, type;
    
    (> .perms(sender()) <);
    if (!setting_templates)
        setting_templates = #[];
    if (type(template) != 'string)
        throw(~type, "Setting templates must be strings.");
    if (type(type) != 'symbol)
        throw(~type, "Setting data types must be symbols.");
    setting_templates = dict_add(setting_templates, template, type);
.

method del_setting_template
    arg template;
    
    (> .perms(sender()) <);
    if (setting_templates) {
        if (template in dict_keys(setting_templates))
            setting_templates = dict_del(setting_templates, template);
    }
.

method set_setting
    arg flag, value;
    var template, objects, x, y, type;
    
    (> .perms(sender()) <);
    
    // is it a valid template?
    template = (| .setting_template(flag) |);
    if (!template)
        throw(~setting, ("Unknown setting \"" + flag) + "\".");
    
    // make sure the value is submitted correctly.
    type = template[2];
    switch (type) {
        case 'boolean:
            if (!(value in [1, 0]))
                throw(~type, ("Value must be boolean (+/-" + flag) + ").");
        case 'integer:
            if (type(value) != 'integer)
                throw(~type, ("Value must be an integer (" + flag) + "=<integer>).");
        case 'string:
            if (type(value) != 'string)
                throw(~type, ("Value must be a string (" + flag) + "=<string>).");
        default:
            throw(~type, "Setting has an unknown type definition, IT'S BROKE.");
    }
    
    // incase they weren't initialized, initialize settings.
    if (!settings)
        settings = #[];
    
    // Ok, set it...
    // for space concerns, if value is null remove the setting.
    if (((type == 'boolean) && (value == 0)) || ((type == 'string) && (value == ""))) {
        if ((| settings[template[1]] |))
            return .unset_setting(template[1]);
    }
    settings = dict_add(settings, template[1], [type, value]);
.

method unset_setting
    arg template;
    
    (> .perms(sender()) <);
    if ((| settings[template] |))
        settings = dict_del(settings, template);
.

method settings
    (> .perms(sender()) <);
    return settings || #[];
.

method setting
    arg template;
    
    return (| (settings[template])[2] |) || 0;
.

method setting_template
    arg template;
    var templates, t, obj;
    
    (> .perms(sender()) <);
    for obj in (.ancestors()) {
        templates = (| obj.setting_templates() |);
        if (templates) {
            t = (| templates[template] |);
            if (t)
                return [template, t];
        }
        if (obj == definer())
            break;
    }
    return 0;
.

method list_settings
    arg how;
    var templates, settings, setting_templates, t, x, len, line, out;
    
    (> .perms(sender()) <);
    len = ((sender().linelen()) - 2) / 2;
    out = [];
    switch (how) {
        case 'all:
            templates = .all_setting_templates();
            settings = .settings();
            setting_templates = dict_keys(settings);
            for x in (templates) {
                for t in (x[2]) {
                    switch (t[2]) {
                        case 'boolean:
                            line = "  " + pad("[+|-]" + (t[1]), len);
                        case 'integer:
                            line = "  " + pad(("     " + (t[1])) + "=<integer>", len);
                        case 'string:
                            line = "  " + pad(("     " + (t[1])) + "=<string>", len);
                    }
                    if (!((t[1]) in setting_templates)) {
                        line = line + " is unset";
                    } else {
                        switch (t[2]) {
                            case 'boolean:
                                line = (line + " is ") + (((settings[t[1]])[2]) ? "+" | "-");
                            default:
                                line = (line + " is ") + toliteral((settings[t[1]])[2]);
                        }
                    }
                    out = [@out, line];
                }
            }
        case 'local:
            settings = .settings();
            if (!settings)
                return ["All settings are either off or unset."];
            for x in (settings) {
                switch ((x[2])[1]) {
                    case 'boolean:
                        line = "  +" + (x[1]);
                    default:
                        line = (("   " + (x[1])) + "=") + toliteral((x[2])[2]);
                }
                [@out, line];
            }
    }
    return out;
.