add better abstraction