Context receivers
At the beginning of this book, we explored one of Kotlin’s most characteristic features: extension functions. These functions allow us to add methods to classes without modifying their original definitions, thanks to a clever compiler technique.
Despite their remarkable capabilities, extension functions have limitations, particularly noticeable to library authors. In this section, we’ll illustrate these limitations using an imaginary database framework as an example.
In Chapter 11, Concurrent Microservices with Ktor, we will examine the Exposed framework, which provides a Kotlin-native approach for interacting with relational databases. This framework serves as a real-world inspiration for our exploration.
For now, let’s consider two interfaces essential for our discussion.
First, the Transaction
interface, facilitating database transactions:
interface Transaction {
fun commit()
fun rollback()
}
Next, an interface...