[REFACTOR] - exception handling and throwing.
[REFACTOR] - using generic interfaces instead of implementations.