Union types

Working proof of concept, just for fun :

 
public class Test {
    public fun doSomething(el: JsonElement) {
    }
}

public class JsonFunction<T, R>(private val self: T, private val method: T.(JsonElement) -> R) {
  public operator fun invoke(arg: Boolean) = self.method(JsonPrimitive(arg))
  public operator fun invoke(arg: Number) = self.method(JsonPrimitive(arg))
  public operator fun invoke(arg: String) = self.method(JsonPrimitive(arg))
  public operator fun invoke(arg: Char) = self.method(JsonPrimitive(arg))
  public operator fun invoke(arg: JsonElement) = self.method(arg)
}

public val Test.doSomethingAuto: JsonFunction<Test, Unit> get() = JsonFunction(this) { doSomething(it) }

public fun main() {
  Test().doSomethingAuto(42)
  Test().doSomethingAuto(“Hello, world”)
}