add validation
adding new abstraction
improve code