Without getting into too much detail, let's see what an example application would look like:
object UserVerboseExample { def main(args: Array[String]): Unit = { val uk = Country("United Kingdom", "uk") val london = City("London", uk) val buckinghamPalace = Address(1, "Buckingham Palace Road", london) val castleBuilders = Company("Castle Builders", buckinghamPalace) val switzerland = Country("Switzerland", "CH") val geneva = City("geneva", switzerland) val genevaAddress = Address(1, "Geneva Lake", geneva) val ivan = User("Ivan", castleBuilders, genevaAddress) System.out.println(ivan) System.out.println("Capitalize UK code...") val ivanFixed = ivan.copy( company = ivan.company.copy( address = ivan.company.address.copy( ...