some basic abstractions to start with