A design methodology for producing highly-adaptable and high-performance simulation frameworks