However, we ARE moving towards better architecture as different parts of the code get worked on to support new features or improve scalability or fix bugs. For an example of inversion-of-control done right, look for use of boost signals and slots; for example:
Code:
boost::signals2::signal<void (CWallet *wallet, const uint256 &hashTx, ChangeType status)> NotifyTransactionChanged;