use `lazy val` instead of `val`