Well, dang it was actually pretty easy. In case anyone else ends up looking for a way to do this, it basically amounts to creating your own library class that extends CI_Form_validation, then overriding run() and/or _execute() to swap out the CI object, which is where the class looks for callbacks. Then just use your own class instead of the built-in one.
An easier way to do this that doesn’t require a custom library would be awesome, but this will do very nicely for now.
Packet Tide owns and develops ExpressionEngine. © Packet Tide, All Rights Reserved.