I am happy to be the first people who disagree with the “one foundation for all” approach. I believe that engineers should use the right tools (available) to solve the problem. Believe me, this is a good word, since each approach / methodology of software development has a large number of "believers", followed by a significant number of pessimists :)
But returning to the question ... I see two main drawbacks of the wireframe approach:
1) It may be excess Sometimes you just need a simple solution for a simple task. You do not need a tool that solves / communicates with solutions to all the problems of mankind.
2) "If you do not use you, you are against us"
The fact is that it is impossible to create a large, mature structure of optimal / simple / adequate solutions for all the problems that she is trying to solve. So sometimes you need to enter an external tool. This can be a pain in ... For example, calling Qt signals from streams other than qt does not work out of the box (this did not work at all). In this case, you may encounter a card. Instead of making your life easier, you can do serious damage to yourself / other people :)
One of the reasons for the two previous points is that it is really hard not to make assumptions. Frames are often used under many assumptions that the programmer will execute / use the A / B component, C ... standard / framework. As soon as hard-coded assumptions are introduced, the likelihood that the structure will be modular falls from the piano from the 10th floor :)
On the other hand, the “right tool for solving problems” approach allows the programmer to focus on one problem and implement it well. I say well:
1) Agnostic data For example (C ++), if you work with strings, do not accept the string type. Allow the user to work with different strings from different frameworks: QString, wxString, std :: string ...
2) Agnostic / extensible policy
The programmer may like the general way to implement any framework, but it may seem that one tiny aspect makes the framework unsuitable for him. That is why the framework user should be able to present their own policies in some key parts.
An example of family sharing with this approach is the internal / external implementation of DSL (Domain Specific Language). A concrete example (C ++) is the Blitz ++ library.
Everything I said earlier also applies to high-level languages. For example, there may be languages created in the Java virtual machine (Scalla for starters).
Hope I made some good points. Best wishes,
Marcin