An example of a multi-screen input wizard. The Wizard is defined declaratively.
/**
 * An example of a wizard in Lift
 */
object MyWizard extends Wizard {
  object completeInfo extends WizardVar(false)

  // define the first screen
  val nameAndAge = new Screen {

    // it has a name field
    val name = new Field with StringField {
      def title = S ?? "First Name"

      override def validation = minLen(2, S ?? "Name Too Short") ::
          maxLen(40, S ?? "Name Too Long") :: super.validation
    }

    // and an age field
    val age = new Field with IntField {
      def title = S ?? "Age"

      override def validation = minVal(5, S ?? "Too young") ::
          maxVal(120, S ?? "You should be dead") :: super.validation
    }

    // choose the next screen based on the age
    override def nextScreen = if (age.is < 18) parentName else favoritePet
  }

  // We ask the parent's name if the person is under 18
  val parentName = new Screen {
    val parentName = new Field with StringField {
      def title = S ?? "Mom or Dad's name"

      override def validation = minLen(2, S ?? "Name Too Short") ::
          maxLen(40, S ?? "Name Too Long") :: super.validation
    }
  }

  // we ask for the favorite pet
  val favoritePet = new Screen {
    val petName = new Field with StringField {
      def title = S ?? "Pet's name"

      override def validation = minLen(2, S ?? "Name Too Short") ::
          maxLen(40, S ?? "Name Too Long") :: super.validation
    }
  }

  // what to do on completion of the wizard
  def finish() {
    S.notice("Thank you for registering your pet")
    completeInfo.set(true)
  }
}