docs: function UISpecifier(uiSpecifierStringOrPagesetName, elementName, args)
  {
      /**
       * Initializes this object from a UI specifier string of the form:
       *
       *     pagesetName::elementName(arg1=value1, arg2=value2, ...)
       *
       * into its component parts, and returns them as an object.
       *
       * @return  an object containing the components of the UI specifier
       * @throws  UISpecifierException
       */
      this._initFromUISpecifierString = function(uiSpecifierString) {
          var matches = /^(.*)::([^\(]+)\((.*)\)$/.exec(uiSpecifierString);
          if (matches == null) {
              throw new UISpecifierException('Error in '
                  + 'UISpecifier._initFromUISpecifierString(): "'
                  + this.string + '" is not a valid UI specifier string');
          }
          this.pagesetName = matches[1];
          this.elementName = matches[2];
          this.args = (matches[3]) ? parse_kwargs(matches[3]) : {};
      };
      
      
      
      /**
       * Override the toString() method to return the UI specifier string when
       * evaluated in a string context. Combines the UI specifier components into
       * a canonical UI specifier string and returns it.
       *
       * @return   a UI specifier string
       */
      this.toString = function() {
          // empty string is acceptable for the path, but it must be defined
          if (this.pagesetName == undefined) {
              throw new UISpecifierException('Error in UISpecifier.toString(): "'
                  + this.pagesetName + '" is not a valid UI specifier pageset '
                  + 'name');
          }
          if (!this.elementName) {
              throw new UISpecifierException('Error in UISpecifier.unparse(): "'
                  + this.elementName + '" is not a valid UI specifier element '
                  + 'name');
          }
          if (!this.args) {
              throw new UISpecifierException('Error in UISpecifier.unparse(): "'
                  + this.args + '" are not valid UI specifier args');
          }
          
          uiElement = UIMap.getInstance()
              .getUIElement(this.pagesetName, this.elementName);
          if (uiElement != null) {
              var kwargs = to_kwargs(this.args, uiElement.argsOrder);
          }
          else {
              // probably under unit test
              var kwargs = to_kwargs(this.args);
          }
          
          return this.pagesetName + '::' + this.elementName + '(' + kwargs + ')';
      };
      
      // construct the object
      if (arguments.length < 2) {
          this._initFromUISpecifierString(uiSpecifierStringOrPagesetName);
      }
      else {
          this.pagesetName = uiSpecifierStringOrPagesetName;
          this.elementName = elementName;
          this.args = (args) ? clone(args) : {};
      }
  }