simplified by impls and traits