separated into classes that can be used independently