moved functionality to a new trait