better abstracted