refactoring into smaller classes, adding tests, added convenience impl PropSetMap which may help make usage easier