better abstractions and avoiding circular references