docs: function (args) {
    if (false === (this instanceof Procedure)) throw new Error('new operator required');
    if (args instanceof Array) { // shorthand for Procedure command
      args = {tasks: args};
    }
    args = args || {};
    var i;
    var unusedProperties = getInvalidProperties(args, ['tasks', 'tasksNeeded', 'tasksCompleted']);
    var errorList = [];
    for (i = 0; i < unusedProperties.length; i++) errorList.push('invalid property: ' + unusedProperties[i]);
    if (errorList.length > 1)
      throw new Error('error creating Procedure: multiple errors');
    if (errorList.length) throw new Error('error creating Procedure: ' + errorList[0]);
    // args ok, now copy to object and check for errors
    for (i in args)
      if (args.hasOwnProperty(i))
        this[i] = args[i];
    errorList = this.getObjectStateErrors(); // before leaving make sure valid Attribute
    if (errorList) {
      if (errorList.length > 1) throw new Error('error creating Procedure: multiple errors');
      if (errorList.length) throw new Error('error creating Procedure: ' + errorList[0]);
    }
  }