implement abstract functions