Funções de cadeia de maneira diferente

As funções Scala possuem os seguintes métodos para encadeamento:

 fn1.andThen(fn2)
 fn1.compose(fn2)

Mas como pode ser escrito neste caso:

Eu tenho funçãocleanUp() que deve ser chamado sempre como último passo. E eu tenho várias outras funções, assim:

class Helper {
  private[this] val umsHelper = new UmsHelper()
  private[this] val user = umsHelper.createUser()
  def cleanUp = ... // delete user/ and other entities

  def prepareModel(model: TestModel) = {
    // create model on behalf of the user
  }

  def commitModel() = {
    // commit model on behalf of the user
  }
}

E algum código externo pode usar código como este:

val help = new Helper()
help.prepareModel()
help.commitModel()
// last step should be called implicitly cleanUp

Como isso pode ser escrito de uma maneira funcional, esse encadeamento sempre chamarácleanUp implicitamente como último passo?

Nota: Eu vejo isso como análogo do destruidor em C ++. Algum encadeamento (não importa como essa cadeia é feita)fn1 andLater fn2 andLater fn3 tem que chamar como último passocleanUp (fn1 andLater fn2 andLater fn3 andLater cleanUp) Errado com a escrita diretacleanUp método é que há uma grande mudança que alguém vai perder esta etapa edo utilizador vazará (permanecer no banco de dados)

questionAnswers(3)

yourAnswerToTheQuestion