companion objectからコンストラクトするようにしつつ、 ClockContextを引き受けられるようにすると... interface ClockContext { val clock: Clock } class User (val id: UUID, val name: String, val created: LocalDateTime) { companion object { context(ClockContext) fun of(name: String): User { require(name.isNotEmpty()) { "name is empty" } return User(UUID.randomUUID(), name, LocalDateTime.now(clock)) } } } 引数をそのままに依存しているコンテキストを宣言できる - (仕様が分かりづらくなるのでclockは引数には入れたくない) - User生成関数の宣言 Clockのインスタンスを持つコンテキスト型を定義