It reminds me of entirely too much of my own code before I realised the
problems with it. (The other problematic thing: thoughtless information
hiding. Yes, reducing coupling is good, but if you have an internal
parameter affecting the behaviour of the system, *export it* somehow, if
need be by way of a separate wrapping shared library with different
interface guarantees, so you can change the implementation and eliminate
or change those parameters, breaking the interface of that wrapping
library, without breaking the interface of the 'real' library. Why? So
that testsuites, not necessarily just those you write, can peek at enough
of the library's internal state that they can guarantee that they've
exercised all its corners.)