/
CDC-1.2b/
CDC-1.2b/src/
parent $misc
parent $has_verbs
object $public

var $root dbref 'public
var $root child_index 0
var $root fertile 1
var $root manager $public
var $root owned [$public]
var $root owners [$public]
var $root writable []
var $root readable ['parameters, 'methods, 'code]
var $root inited 1
var $public public []
var $has_verbs verbs #[["@public on %this is *", ['public_vrb, 'remote]]]

method init_public
    .perms(caller(), $root);
    public = ['readable];
.

method is_publicly
    arg what;
    
    return what in public;
.

method set_public
    arg what;
    var x, valid;
    
    if (sender() != this())
        .perms(sender(), 'manager);
    if (type(what) == 'symbol) {
        if (what in public)
            return;
        what = [@public, what];
    }
    if (type(what) != 'list)
        throw(~type, toliteral(what) + " is an invalid type.");
    public = what;
.

method public
    return public;
.

method public_vrb
    arg vrb, on, this, is, args;
    var x, syn, p, who, opts;
    
    .perms(sender(), 'manager);
    syn = ((vrb + " on ") + this) + " <+/-[r|w]>";
    who = sender();
    if (!args)
        $parse.tell_error(["Must specify either readable or writable.", ("Current Public permissions: " + ($list.to_english(public))) + "."], syn, who);
    opts = #[["r", [1, 0]], ["w", [0, 0]]];
    args = $parse.options(args, opts);
    opts = args[2];
    args = args[1];
    if ((!((opts["r"])[1])) && ('readable in public))
        .set_public(setremove(public, 'readable));
    else if (((opts["r"])[1]) && (!('readable in public)))
        .set_public(public + ['readable]);
    if ((!((opts["w"])[1])) && ('writable in public))
        .set_public(setremove(public, 'writable));
    else if (((opts["w"])[1]) && (!('writable in public)))
        .set_public(public + ['writable]);
    sender().tell(("Public perms changed to: " + ($list.to_english(public))) + ".");
.