Sometimes you just want to call the copy method for the same "parameters", but not care about what underlying type it is.

Because case class .copy() methods are auto generated per case class, you can't call copy on the abstract class, so this approach uses some scala foo to generate a 
scala Function that generates the correct magic for you.