docs: function detect_ext_define(cls, ast) {
    // defaults
    cls["extends"] = "Ext.Base";
    cls["requires"] = [];
    cls["uses"] = [];
    cls["alternateClassNames"] = [];
    cls["mixins"] = [];
    cls["aliases"] = [];
    cls["members"] = [];
    cls["code_type"] = "ext_define";
    
    each_pair_in_object_expression(ast["arguments"][1], function(key, value, pair) {
      switch (key) {
       case "extend":
          cls["extends"] = make_string(value);
          break;
       case "override":
          cls["override"] = make_string(value);
          break;
       case "requires":
          cls["requires"] = make_string_list(value);
          break;
       case "uses":
          cls["uses"] = make_string_list(value);
          break;
       case "alternateClassName":
          cls["alternateClassNames"] = make_string_list(value);
          break;
       case "mixins":
          cls["mixins"] = make_mixins(value);
          break;
       case "singleton":
          cls["singleton"] = make_singleton(value);
          break;
       case "alias":
          cls["aliases"] += make_string_list(value);
          break;
       case "see":
          cls["see"] += make_string_list(value);
          break;
       case "xtype":
          cls["aliases"] += _.map(make_string_list(value), function(xtype) { return "widget."+xtype });
          break;
       case "config":
          cls["members"] += make_configs(value, {"accessor": true});
          break;
       case "cachedConfig":
          cls["members"] += make_configs(value, {"accessor": true});
          break;
       case "eventedConfig":
          cls["members"] += make_configs(value, {"accessor": true, "evented": true});
          break;
       case "statics":
          cls["members"] += make_statics(value);
          break;
       case "inheritableStatics":
          cls["members"] += make_statics(value, {"inheritable": true});
          break;
       default:
          detect_method_or_property(cls, key, value, pair);
          break;
      }
    });
  }