don't need this to be a framework, but rather a set of components