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; .