xautoload, in addition to the other class loading stuff, enables a wildcard syntax for the files[] directive, in case you don't want the full transition to PSR-4. This allows to clean up your info files, but keep class files where they are, so you can do the real PSR-4 transition another day.

This has little performance implications, because the scan only happens when the class files registry is rebuilt.

Example: Views.
In views.info, the files[] stuff could be replaced with

; Only look at the top level.
files[] = handlers/*.inc
files[] = includes/*.inc
files[] = plugins/*.inc
; Scan the one-below-top level and deeper.
files[] = modules/*/**/*.inc
; Scan the top level and deeper.
files[] = tests/**/*.test

The /*/ wildcard can be any string between two slashes.
The /**/ wildcard can be either / or /*/ or /*/*/ etc.
A /** ending a string can be just anything starting with a slash.
A /*.inc ending a string is a filename with a ".inc" extension.

The original views.info:

  12 files[] = handlers/views_handler_area.inc
  13 files[] = handlers/views_handler_area_result.inc
  14 files[] = handlers/views_handler_area_text.inc
  15 files[] = handlers/views_handler_area_view.inc
  16 files[] = handlers/views_handler_argument.inc
  17 files[] = handlers/views_handler_argument_date.inc
  18 files[] = handlers/views_handler_argument_formula.inc
  19 files[] = handlers/views_handler_argument_many_to_one.inc
  20 files[] = handlers/views_handler_argument_null.inc
  21 files[] = handlers/views_handler_argument_numeric.inc
  22 files[] = handlers/views_handler_argument_string.inc
  23 files[] = handlers/views_handler_argument_group_by_numeric.inc
  24 files[] = handlers/views_handler_field.inc
  25 files[] = handlers/views_handler_field_counter.inc
  26 files[] = handlers/views_handler_field_boolean.inc
  27 files[] = handlers/views_handler_field_custom.inc
  28 files[] = handlers/views_handler_field_date.inc
  29 files[] = handlers/views_handler_field_entity.inc
  30 files[] = handlers/views_handler_field_markup.inc
  31 files[] = handlers/views_handler_field_math.inc
  32 files[] = handlers/views_handler_field_numeric.inc
  33 files[] = handlers/views_handler_field_prerender_list.inc
  34 files[] = handlers/views_handler_field_time_interval.inc
  35 files[] = handlers/views_handler_field_serialized.inc
  36 files[] = handlers/views_handler_field_url.inc
  37 files[] = handlers/views_handler_filter.inc
  38 files[] = handlers/views_handler_filter_boolean_operator.inc
  39 files[] = handlers/views_handler_filter_boolean_operator_string.inc
  40 files[] = handlers/views_handler_filter_date.inc
  41 files[] = handlers/views_handler_filter_equality.inc
  42 files[] = handlers/views_handler_filter_group_by_numeric.inc
  43 files[] = handlers/views_handler_filter_in_operator.inc
  44 files[] = handlers/views_handler_filter_many_to_one.inc
  45 files[] = handlers/views_handler_filter_numeric.inc
  46 files[] = handlers/views_handler_filter_string.inc
  47 files[] = handlers/views_handler_relationship.inc
  48 files[] = handlers/views_handler_relationship_groupwise_max.inc
  49 files[] = handlers/views_handler_sort.inc
  50 files[] = handlers/views_handler_sort_date.inc
  51 files[] = handlers/views_handler_sort_formula.inc
  52 files[] = handlers/views_handler_sort_group_by_numeric.inc
  53 files[] = handlers/views_handler_sort_menu_hierarchy.inc
  54 files[] = handlers/views_handler_sort_random.inc
  55 ; Includes
  56 files[] = includes/base.inc
  57 files[] = includes/handlers.inc
  58 files[] = includes/plugins.inc
  59 files[] = includes/view.inc
  60 ; Modules
  61 files[] = modules/aggregator/views_handler_argument_aggregator_fid.inc
  62 files[] = modules/aggregator/views_handler_argument_aggregator_iid.inc
  63 files[] = modules/aggregator/views_handler_argument_aggregator_category_cid.inc
  64 files[] = modules/aggregator/views_handler_field_aggregator_title_link.inc
  65 files[] = modules/aggregator/views_handler_field_aggregator_category.inc
  66 files[] = modules/aggregator/views_handler_field_aggregator_item_description.inc
  67 files[] = modules/aggregator/views_handler_field_aggregator_xss.inc
  68 files[] = modules/aggregator/views_handler_filter_aggregator_category_cid.inc
  69 files[] = modules/aggregator/views_plugin_row_aggregator_rss.inc
  70 files[] = modules/comment/views_handler_argument_comment_user_uid.inc
  71 files[] = modules/comment/views_handler_field_comment.inc
  72 files[] = modules/comment/views_handler_field_comment_depth.inc
  73 files[] = modules/comment/views_handler_field_comment_link.inc
  74 files[] = modules/comment/views_handler_field_comment_link_approve.inc
  75 files[] = modules/comment/views_handler_field_comment_link_delete.inc
  76 files[] = modules/comment/views_handler_field_comment_link_edit.inc
  77 files[] = modules/comment/views_handler_field_comment_link_reply.inc
  78 files[] = modules/comment/views_handler_field_comment_node_link.inc
  79 files[] = modules/comment/views_handler_field_comment_username.inc
  80 files[] = modules/comment/views_handler_field_ncs_last_comment_name.inc
  81 files[] = modules/comment/views_handler_field_ncs_last_updated.inc
  82 files[] = modules/comment/views_handler_field_node_comment.inc
  83 files[] = modules/comment/views_handler_field_node_new_comments.inc
  84 files[] = modules/comment/views_handler_field_last_comment_timestamp.inc
  85 files[] = modules/comment/views_handler_filter_comment_user_uid.inc
  86 files[] = modules/comment/views_handler_filter_ncs_last_updated.inc
  87 files[] = modules/comment/views_handler_filter_node_comment.inc
  88 files[] = modules/comment/views_handler_sort_comment_thread.inc
  89 files[] = modules/comment/views_handler_sort_ncs_last_comment_name.inc
  90 files[] = modules/comment/views_handler_sort_ncs_last_updated.inc
  91 files[] = modules/comment/views_plugin_row_comment_rss.inc
  92 files[] = modules/comment/views_plugin_row_comment_view.inc
  93 files[] = modules/contact/views_handler_field_contact_link.inc
  94 files[] = modules/field/views_handler_field_field.inc
  95 files[] = modules/field/views_handler_relationship_entity_reverse.inc
  96 files[] = modules/field/views_handler_argument_field_list.inc
  97 files[] = modules/field/views_handler_filter_field_list.inc
  98 files[] = modules/filter/views_handler_field_filter_format_name.inc
  99 files[] = modules/locale/views_handler_argument_locale_group.inc
 100 files[] = modules/locale/views_handler_argument_locale_language.inc
 101 files[] = modules/locale/views_handler_field_locale_group.inc
 102 files[] = modules/locale/views_handler_field_locale_language.inc
 103 files[] = modules/locale/views_handler_field_locale_link_edit.inc
 104 files[] = modules/locale/views_handler_filter_locale_group.inc
 105 files[] = modules/locale/views_handler_filter_locale_language.inc
 106 files[] = modules/locale/views_handler_filter_locale_version.inc
 107 files[] = modules/node/views_handler_argument_dates_various.inc
 108 files[] = modules/node/views_handler_argument_node_language.inc
 109 files[] = modules/node/views_handler_argument_node_nid.inc
 110 files[] = modules/node/views_handler_argument_node_type.inc
 111 files[] = modules/node/views_handler_argument_node_vid.inc
 112 files[] = modules/node/views_handler_argument_node_uid_revision.inc
 113 files[] = modules/node/views_handler_field_history_user_timestamp.inc
 114 files[] = modules/node/views_handler_field_node.inc
 115 files[] = modules/node/views_handler_field_node_link.inc
 116 files[] = modules/node/views_handler_field_node_link_delete.inc
 117 files[] = modules/node/views_handler_field_node_link_edit.inc
 118 files[] = modules/node/views_handler_field_node_revision.inc
 119 files[] = modules/node/views_handler_field_node_revision_link_delete.inc
 120 files[] = modules/node/views_handler_field_node_revision_link_revert.inc
 121 files[] = modules/node/views_handler_field_node_path.inc
 122 files[] = modules/node/views_handler_field_node_type.inc
 123 files[] = modules/node/views_handler_filter_history_user_timestamp.inc
 124 files[] = modules/node/views_handler_filter_node_access.inc
 125 files[] = modules/node/views_handler_filter_node_status.inc
 126 files[] = modules/node/views_handler_filter_node_type.inc
 127 files[] = modules/node/views_handler_filter_node_uid_revision.inc
 128 files[] = modules/node/views_plugin_argument_default_node.inc
 129 files[] = modules/node/views_plugin_argument_validate_node.inc
 130 files[] = modules/node/views_plugin_row_node_rss.inc
 131 files[] = modules/node/views_plugin_row_node_view.inc
 132 files[] = modules/profile/views_handler_field_profile_date.inc
 133 files[] = modules/profile/views_handler_field_profile_list.inc
 134 files[] = modules/profile/views_handler_filter_profile_selection.inc
 135 files[] = modules/search/views_handler_argument_search.inc
 136 files[] = modules/search/views_handler_field_search_score.inc
 137 files[] = modules/search/views_handler_filter_search.inc
 138 files[] = modules/search/views_handler_sort_search_score.inc
 139 files[] = modules/search/views_plugin_row_search_view.inc
 140 files[] = modules/statistics/views_handler_field_accesslog_path.inc
 141 files[] = modules/system/views_handler_argument_file_fid.inc
 142 files[] = modules/system/views_handler_field_file.inc
 143 files[] = modules/system/views_handler_field_file_extension.inc
 144 files[] = modules/system/views_handler_field_file_filemime.inc
 145 files[] = modules/system/views_handler_field_file_uri.inc
 146 files[] = modules/system/views_handler_field_file_status.inc
 147 files[] = modules/system/views_handler_filter_file_status.inc
 148 files[] = modules/taxonomy/views_handler_argument_taxonomy.inc
 149 files[] = modules/taxonomy/views_handler_argument_term_node_tid.inc
 150 files[] = modules/taxonomy/views_handler_argument_term_node_tid_depth.inc
 151 files[] = modules/taxonomy/views_handler_argument_term_node_tid_depth_modifier.inc
 152 files[] = modules/taxonomy/views_handler_argument_vocabulary_vid.inc
 153 files[] = modules/taxonomy/views_handler_argument_vocabulary_machine_name.inc
 154 files[] = modules/taxonomy/views_handler_field_taxonomy.inc
 155 files[] = modules/taxonomy/views_handler_field_term_node_tid.inc
 156 files[] = modules/taxonomy/views_handler_field_term_link_edit.inc
 157 files[] = modules/taxonomy/views_handler_filter_term_node_tid.inc
 158 files[] = modules/taxonomy/views_handler_filter_term_node_tid_depth.inc
 159 files[] = modules/taxonomy/views_handler_filter_vocabulary_vid.inc
 160 files[] = modules/taxonomy/views_handler_filter_vocabulary_machine_name.inc
 161 files[] = modules/taxonomy/views_handler_relationship_node_term_data.inc
 162 files[] = modules/taxonomy/views_plugin_argument_validate_taxonomy_term.inc
 163 files[] = modules/taxonomy/views_plugin_argument_default_taxonomy_tid.inc
 164 ;files[] = modules/translation/views_handler_argument_node_language.inc
 165 files[] = modules/system/views_handler_filter_system_type.inc
 166 files[] = modules/translation/views_handler_argument_node_tnid.inc
 167 files[] = modules/translation/views_handler_field_node_language.inc
 168 files[] = modules/translation/views_handler_field_node_link_translate.inc
 169 files[] = modules/translation/views_handler_field_node_translation_link.inc
 170 files[] = modules/translation/views_handler_filter_node_language.inc
 171 files[] = modules/translation/views_handler_filter_node_tnid.inc
 172 files[] = modules/translation/views_handler_filter_node_tnid_child.inc
 173 files[] = modules/translation/views_handler_relationship_translation.inc
 174 files[] = modules/upload/views_handler_field_upload_description.inc
 175 files[] = modules/upload/views_handler_field_upload_fid.inc
 176 files[] = modules/upload/views_handler_filter_upload_fid.inc
 177 files[] = modules/user/views_handler_argument_user_uid.inc
 178 files[] = modules/user/views_handler_argument_users_roles_rid.inc
 179 files[] = modules/user/views_handler_field_user.inc
 180 files[] = modules/user/views_handler_field_user_language.inc
 181 files[] = modules/user/views_handler_field_user_link.inc
 182 files[] = modules/user/views_handler_field_user_link_cancel.inc
 183 files[] = modules/user/views_handler_field_user_link_edit.inc
 184 files[] = modules/user/views_handler_field_user_mail.inc
 185 files[] = modules/user/views_handler_field_user_name.inc
 186 files[] = modules/user/views_handler_field_user_permissions.inc
 187 files[] = modules/user/views_handler_field_user_picture.inc
 188 files[] = modules/user/views_handler_field_user_roles.inc
 189 files[] = modules/user/views_handler_filter_user_current.inc
 190 files[] = modules/user/views_handler_filter_user_name.inc
 191 files[] = modules/user/views_handler_filter_user_permissions.inc
 192 files[] = modules/user/views_handler_filter_user_roles.inc
 193 files[] = modules/user/views_plugin_argument_default_current_user.inc
 194 files[] = modules/user/views_plugin_argument_default_user.inc
 195 files[] = modules/user/views_plugin_argument_validate_user.inc
 196 ; Plugins
 197 files[] = plugins/views_plugin_access.inc
 198 files[] = plugins/views_plugin_access_none.inc
 199 files[] = plugins/views_plugin_access_perm.inc
 200 files[] = plugins/views_plugin_access_role.inc
 201 files[] = plugins/views_plugin_argument_default.inc
 202 files[] = plugins/views_plugin_argument_default_php.inc
 203 files[] = plugins/views_plugin_argument_default_fixed.inc
 204 files[] = plugins/views_plugin_argument_default_raw.inc
 205 files[] = plugins/views_plugin_argument_validate.inc
 206 files[] = plugins/views_plugin_argument_validate_numeric.inc
 207 files[] = plugins/views_plugin_argument_validate_php.inc
 208 files[] = plugins/views_plugin_cache.inc
 209 files[] = plugins/views_plugin_cache_none.inc
 210 files[] = plugins/views_plugin_cache_time.inc
 211 files[] = plugins/views_plugin_display.inc
 212 files[] = plugins/views_plugin_display_attachment.inc
 213 files[] = plugins/views_plugin_display_block.inc
 214 files[] = plugins/views_plugin_display_default.inc
 215 files[] = plugins/views_plugin_display_extender.inc
 216 files[] = plugins/views_plugin_display_feed.inc
 217 files[] = plugins/views_plugin_exposed_form_basic.inc
 218 files[] = plugins/views_plugin_exposed_form.inc
 219 files[] = plugins/views_plugin_exposed_form_input_required.inc
 220 files[] = plugins/views_plugin_display_page.inc
 221 files[] = plugins/views_plugin_localization_core.inc
 222 files[] = plugins/views_plugin_localization.inc
 223 files[] = plugins/views_plugin_localization_none.inc
 224 files[] = plugins/views_plugin_pager.inc
 225 files[] = plugins/views_plugin_pager_full.inc
 226 files[] = plugins/views_plugin_pager_mini.inc
 227 files[] = plugins/views_plugin_pager_none.inc
 228 files[] = plugins/views_plugin_pager_some.inc
 229 files[] = plugins/views_plugin_query.inc
 230 files[] = plugins/views_plugin_query_default.inc
 231 files[] = plugins/views_plugin_row.inc
 232 files[] = plugins/views_plugin_row_fields.inc
 233 files[] = plugins/views_plugin_style.inc
 234 files[] = plugins/views_plugin_style_default.inc
 235 files[] = plugins/views_plugin_style_grid.inc
 236 files[] = plugins/views_plugin_style_list.inc
 237 files[] = plugins/views_plugin_style_jump_menu.inc
 238 files[] = plugins/views_plugin_style_rss.inc
 239 files[] = plugins/views_plugin_style_summary.inc
 240 files[] = plugins/views_plugin_style_summary_jump_menu.inc
 241 files[] = plugins/views_plugin_style_summary_unformatted.inc
 242 files[] = plugins/views_plugin_style_table.inc
 243 
 244 ; Tests
 245 files[] = tests/handlers/views_handler_area_text.test
 246 files[] = tests/handlers/views_handler_argument_null.test
 247 files[] = tests/handlers/views_handler_field_boolean.test
 248 files[] = tests/handlers/views_handler_field_custom.test
 249 files[] = tests/handlers/views_handler_field_counter.test
 250 files[] = tests/handlers/views_handler_field_date.test
 251 files[] = tests/handlers/views_handler_field_file_size.test
 252 files[] = tests/handlers/views_handler_field_math.test
 253 files[] = tests/handlers/views_handler_field_url.test
 254 files[] = tests/handlers/views_handler_field_xss.test
 255 files[] = tests/handlers/views_handler_filter_date.test
 256 files[] = tests/handlers/views_handler_filter_equality.test
 257 files[] = tests/handlers/views_handler_filter_in_operator.test
 258 files[] = tests/handlers/views_handler_filter_numeric.test
 259 files[] = tests/handlers/views_handler_filter_string.test
 260 files[] = tests/handlers/views_handler_sort_random.test
 261 files[] = tests/handlers/views_handler_sort_date.test
 262 files[] = tests/handlers/views_handler_sort.test
 263 files[] = tests/test_plugins/views_test_plugin_access_test_dynamic.inc
 264 files[] = tests/test_plugins/views_test_plugin_access_test_static.inc
 265 files[] = tests/styles/views_plugin_style_jump_menu.test
 266 files[] = tests/styles/views_plugin_style.test
 267 files[] = tests/views_access.test
 268 files[] = tests/views_analyze.test
 269 files[] = tests/views_basic.test
 270 files[] = tests/views_argument_default.test
 271 files[] = tests/views_argument_validator.test
 272 files[] = tests/views_exposed_form.test
 273 files[] = tests/views_glossary.test
 274 files[] = tests/views_groupby.test
 275 files[] = tests/views_handlers.test
 276 files[] = tests/views_module.test
 277 files[] = tests/views_pager.test
 278 files[] = tests/views_plugin_localization_test.inc
 279 files[] = tests/views_translatable.test
 280 files[] = tests/views_query.test
 281 files[] = tests/views_upgrade.test
 282 files[] = tests/views_test.views_default.inc
 283 files[] = tests/comment/views_handler_argument_comment_user_uid.test
 284 files[] = tests/comment/views_handler_filter_comment_user_uid.test
 285 files[] = tests/user/views_user_argument_default.test
 286 files[] = tests/user/views_user_argument_validate.test
 287 files[] = tests/user/views_user.test
 288 files[] = tests/views_cache.test
 289 files[] = tests/views_view.test
 290 files[] = tests/views_ui.test

Sick, eh?

Disclaimer: Probably this does not work for the "tests" stuff, because drupal.org testbot does not have xautoload installed.

Comments

erlendoos’s picture

Wow! awesome module. I thought that xautoload required a certain directory naming convention like PSR-0, but this is much better.

donquixote’s picture

I would still recommend that you use PSR-0 or PSR-4, so that it is more predictable where your classes are defined.
Arbitrariness is the enemy!