abstract classes instead of trait when relevant