docs: function Requisition(environment, doc, commandOutputManager) {
    this.environment = environment;
    this.document = doc;
    if (this.document == null) {
      try {
        this.document = document;
      }
      catch (ex) {
        // Ignore
      }
    }
    this.commandOutputManager = commandOutputManager || new CommandOutputManager();
  
    // The command that we are about to execute.
    // @see setCommandConversion()
    this.commandAssignment = new CommandAssignment();
    var promise = this.setAssignment(this.commandAssignment, null,
                                     { skipArgUpdate: true });
    util.synchronize(promise);
  
    // The object that stores of Assignment objects that we are filling out.
    // The Assignment objects are stored under their param.name for named
    // lookup. Note: We make use of the property of Javascript objects that
    // they are not just hashmaps, but linked-list hashmaps which iterate in
    // insertion order.
    // _assignments excludes the commandAssignment.
    this._assignments = {};
  
    // The count of assignments. Excludes the commandAssignment
    this.assignmentCount = 0;
  
    // Used to store cli arguments in the order entered on the cli
    this._args = [];
  
    // Used to store cli arguments that were not assigned to parameters
    this._unassigned = [];
  
    // Temporarily set this to true to prevent _assignmentChanged resetting
    // argument positions
    this._structuralChangeInProgress = false;
  
    this.commandAssignment.onAssignmentChange.add(this._commandAssignmentChanged, this);
    this.commandAssignment.onAssignmentChange.add(this._assignmentChanged, this);
  
    this.onAssignmentChange = util.createEvent('Requisition.onAssignmentChange');
    this.onTextChange = util.createEvent('Requisition.onTextChange');
  }