docs: function (str, options)
          {
              options = options || { };
              var optimize = options.optimize;
              var optimizerList = [];
              if (optimize)
              {
                  var optimizeComplex;
                  var optimizeToString;
                  if (typeof optimize === 'object')
                  {
                      optimizeComplex     = !!optimize.complexOpt;
                      optimizeToString    = !!optimize.toStringOpt;
                  }
                  else
                      optimizeComplex = optimizeToString = true;
                  var optimizers = this.optimizers;
                  var optimizer;
                  if (optimizeComplex)
                  {
                      var complexOptimizers = optimizers.complex;
                      if (!complexOptimizers)
                          complexOptimizers = optimizers.complex = createEmpty();
                      for (var complex in COMPLEX)
                      {
                          var entry = COMPLEX[complex];
                          if (this.hasFeatures(entry.mask) && str.indexOf(complex) >= 0)
                          {
                              optimizer =
                              complexOptimizers[complex] ||
                              (
                                  complexOptimizers[complex] =
                                  getComplexOptimizer(this, complex, entry.definition)
                              );
                              optimizerList.push(optimizer);
                          }
                      }
                  }
                  if (optimizeToString)
                  {
                      optimizer =
                      optimizers.toString || (optimizers.toString = getToStringOptimizer(this));
                      optimizerList.push(optimizer);
                  }
              }
              var buffer =
              new ScrewBuffer
              (options.bond, options.forceString, this.maxGroupThreshold, optimizerList);
              var firstSolution = options.firstSolution;
              var maxLength = options.maxLength;
              if (firstSolution)
              {
                  buffer.append(firstSolution);
                  if (buffer.length > maxLength)
                      return;
              }
              var match;
              var regExp = _RegExp(STR_TOKEN_PATTERN, 'g');
              while (match = regExp.exec(str))
              {
                  var token;
                  var solution;
                  if (token = match[2])
                      solution = this.resolveCharacter(token);
                  else
                  {
                      token = match[1];
                      solution = SIMPLE[token];
                  }
                  if (!buffer.append(solution) || buffer.length > maxLength)
                      return;
              }
              var result = _String(buffer);
              if (!(result.length > maxLength))
                  return result;
          }