part A - fully working nicely against requirements