add documentation; refactor confusing method; make BaseStrategy an abstract class