docs: function (obj, rec, filters, keepMeta) {
                  rec = (rec !== false);
                  var container = false, res;
                  if (typeUtils.isArray(obj)) {
                      res = [];
                      container = true;
                  } else if (typeUtils.isObject(obj)) {
                      res = {};
                      container = true;
                  }
                  if (container) {
                      for (var key in obj) {
                          if (obj.hasOwnProperty(key)) {
                              if (key.indexOf(":") != -1) {
                                  if (!keepMeta) {
                                      continue;
                                  } else {
                                      // meta-data from aria : we never copy them
                                      if (this.isMetadata(key)) {
                                          continue;
                                      }
                                  }
                              }
  
                              if (filters && !arrayUtils.contains(filters, key)) {
                                  continue; // filter elements
                              }
  
                              if (rec) {
                                  res[key] = this.copy(obj[key], rec, null, keepMeta);
                              } else {
                                  res[key] = obj[key];
                              }
                          }
                      }
                  } else if (typeUtils.isDate(obj)) {
                      res = new Date(obj.getTime());
                  } else {
                      res = obj;
                  }
                  return res;
              }