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”)
}