> "'connect.cached.new' => [\&pre, \&post]" syntax so that I could do
If I understand correctly, the QPSMTPD people have just implemented self-registering callbacks in modules by standardizing the names of the callbacks and letting package introspection find them all. The names are hook_* where * is one of the times that there is a hook for. Using that naming convention, a module would register it callback with the DBI framework by merely having a function called something like sub hook_connect_cached_new_pre{ ... } Perhaps the import function invoked by use DBI::callback_hooks; could inspect the functions defined in its caller()'s package and register what it finds there with the calling-back mechanism. Just an idea -- I do not know if this approach would be better or worse than what is currently being done, or even if it is the same as what is currently being done -- but in my opinion having multiple levels of naming > "'connect.cached.new' => [\&pre, \&post]" is going to be a hassle compared with a single level of naming that gets as detailed as it needs. connect_cached_new_pre => \&pre, connect_cached_new_post => \&post; In the proposal at the top of this e-mail, presuming you have the pre and post subs already written and don't want to touch them, the registration of them could be implied with something like INIT{ *DBIhook_connect_cached_new_pre = \⪯ *DBIhook_connect_cached_new_post = \&post; } if you don't want to just change their names.