abstract functions instead of hardcode