abstraction via interface