fully functional with no OO boilerplate