more abstractions to decouple.