do better abstraction