setting up to change the learner into an abstract class, because defining component functions outside of it is getting tiresome