add interfaces for more flexibility