with abstraction