I was actually envisioning that the base class would implement the plugin methods and then defer to simpler methods for sub-classes to implement and to provide, if necessary, convenience methods.

For example, it could implement procesModule, and within that call an abstract supports(type) method, only if true pass to a doProcessModule (or better name).

Also, for the bean-def-adding-BFPP, I was thinking the abstract plugin could simply take care of that, stashing a ref to the shared context by itself implementing postProcessSharedContext(..) and not requiring the impls to have that method.. instead it could just provide addBeanDefinition(name, bean) as a convenience for the subclasses. That way the base class handles all the BFPP related concerns and even keeps track of the shared context.