completed part 3 of tutorial, refactored to use cbv