[eluser]lsemel[/eluser]
Regarding my question about "Rails style counter cache", I realized that overriding save() wouldn't be a great solution because it wouldn't take into account deletes, would need to be done on both sides of the relationship, and would execute on every single save() even if the relationship wasn't changing, unless I parsed out the arguments and tried to identify when a relationship is being saved. Since save() and delete() take a variety of different formats for the arguments, that would definitely be a tricky process and would break if those arguments ever change.
I also checked out the prepping validation method more, but according to the code, validation takes place before saves of related objects, so my count of related objects would end up being off, and there also no way to handle deletes.
I think your idea of calling a user-defined callback right before, or right after, any table is inserted, updated, or deleted, and providing an opportunity to execute code (such as to compute the new related count) is the way to go.