/
CDC-1.1/
parent $foundation
object $input

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

method finish_receiving
    var oreceiving, oinput;
    
    // called by $input_parser.parse when one is finished.
    .perms(sender(), 'parser);
    
    // we have to reset the parameter before we run it's values.
    oreceiving = receiving;
    oinput = input;
    .reset_input();
    (oreceiving[2]).(oreceiving[3])(oinput, @sublist(oreceiving, 4));
.

method start_receiving
    arg lines, obj, method, [args];
    
    // called by this().read() or this().read_line()
    .perms(sender(), 'this);
    receiving = [lines, obj, method, @args];
    input = [];
    .add_parser($input_parser, 'first);
.

method reset_input
    // resets values, for aborting or other emergency reset.
    .perms(sender(), 'parser);
    receiving = 0;
    input = 0;
    .del_parser($input_parser);
.

method new_line
    arg line;
    
    // called by $input_parser.parse with a new string to be added.
    .perms(sender(), 'parser);
    input = [@input, line];
.

method lines
    // returns how many lines the user wishes to read.
    return receiving[1];
.

method read
    arg method, [args];
    
    // read input lines from the user.
    // returns sender().method(["input", "lines"], @args);
    if (receiving)
        throw(~wait, "User is currently receiving input.");
    if (type(method) != 'symbol)
        throw(~type, "Method reference must be given as a symbol.");
    
    // looks ok.
    .start_receiving('terminated, sender(), method, @args);
.

method prompt
    arg prompt, method, [args];
    
    .read_line(method, @args);
    
    //   .tell(prompt);
    .non_terminated_tell(prompt);
.

method read_line
    arg method, [args];
    
    // read input lines from the user.
    // returns sender().method(["input", "lines"], @args);
    if (receiving)
        throw(~wait, "User is currently receiving input.");
    if (type(method) != 'symbol)
        throw(~type, "Method reference must be given as a symbol.");
    
    // looks ok.
    .start_receiving('one, sender(), method, @args);
.