so much refactoring

interfaces everywhere
closes #7