docs: function print_r(object, maxDepth, indent)
  {
      var parentIndent, attr, str = "";
      if (arguments.length == 1) {
          var maxDepth = Number.MAX_VALUE;
      } else {
          maxDepth--;
      }
      if (arguments.length < 3) {
          parentIndent = ''
          var indent = '    ';
      } else {
          parentIndent = indent;
          indent += '    ';
      }
  
      switch(typeof(object)) {
      case 'object':
          if (object.length != undefined) {
              if (object.length == 0) {
                  str += "Array ()\r\n";
              }
              else {
                  str += "Array (\r\n";
                  for (var i = 0; i < object.length; ++i) {
                      str += indent + '[' + i + '] => ';
                      if (maxDepth == 0)
                          str += "...\r\n";
                      else
                          str += print_r(object[i], maxDepth, indent);
                  }
                  str += parentIndent + ")\r\n";
              }
          }
          else {
              str += "Object (\r\n";
              for (attr in object) {
                  str += indent + "[" + attr + "] => ";
                  if (maxDepth == 0)
                      str += "...\r\n";
                  else
                      str += print_r(object[attr], maxDepth, indent);
              }
              str += parentIndent + ")\r\n";
          }
          break;
      case 'boolean':
          str += (object ? 'true' : 'false') + "\r\n";
          break;
      case 'function':
          str += "Function\r\n";
          break;
      default:
          str += object + "\r\n";
          break;
  
      }
      return str;
  }