Refactored to complete requirements

1 - uses different collections and maps
2 - uses composition