just about abstracted State...
finished abstracting State - just need to properly test...