This is a demonstration of a possible step by step approach, not working code to be committed in one issue.