lazy val, not private def, for efficiency