Personally I would prefer a modular design, with things such as emerge --search, the data-handling system (saving ebuilds, the caches, ect), and all that being entered seperatly, with the core making calls to each so that, say, you wanted to use a specific database (we will say Oracle here) instead of plain text or MySQL, you could emerge a new data-handler.