added cache for getTimesPlayed()