Every blockchain has different implementations of a transaction pool, which does the job of checking transaction validity before transactions are included by block authors. In Substrate it is possible to implement custom transaction validation logic as well as how transaction priority is defined.
I understand that this is possible by implementing runtime APIs that check for certain requirements defined in the runtime. But I wonder what on the client side makes Substrate's transaction pool modular and extensible ?