well, it works, but it's awful
Cleaned up impls with Enum and Read some
refactored out some duplication
last refactoring before I go another route