improve: cleaner class hierarchy