Refactor to use reflection;
Major refactor;