Thank you, Michael and Brian.
The issue with using the TabUpdated event is that I want to overwrite the TabInfo object itself, which will put me into infinite recursion:

Line 34 will keep calling the TabUpdated method over and over again.
I could probably write my own DAL2 controller and class to directly write the TabInfo object to the DB instead of using TabController, but I thought to ask here if there's a better way along the lines of "filters", which could look something like this:

This is assuming that we can pass args.Tab by reference, such that it can be modified within the PreTabUpdated method. If not, then we could change it to return a TabInfo object rather than returning void. This is referred to as "filters" by other CMSs.