more abstract interface