! ===============================================
  ! Programa de ejemplo en Zero
  ! Pequeña aplicación de agenda
  ! ===============================================

  object Persona
    attribute + nombre = "Pepito perez"
    attribute + edad = 50
    attribute + telefono = "988310000"

    method + putNombre ( n )
      nombre = n
      return
    endMethod

    method + putEdad ( ed )
      isInstanceOf Int ed
      jumpOnFalseTo else
      edad = ed
      jumpOnTrueTo fin
      : else
      throw ETypeMismatch
      : fin
      return
    endMethod

    method + putTelefono ( tlf )
      telefono = tlf
      return
    endMethod

    method + toString ( )
      reference toret

      toret = nombre
      toret = toret.concat ( ": edad " )
      toret = toret.concat ( edad.toString ( ) )
      toret = toret.concat ( ", tlf: " )
      toret = toret.concat ( telefono )
      return toret
    endMethod
  endObject

  object Agenda : Map
  endObject

  object AplicacionAgenda : ConsoleApplication
    method + masPersonas ( )
      reference nombre
      reference edad
      reference telefono
      reference toret

      System.console.write ( "Introduzca el nombre: " )
      nombre = System.console.read ( )

      System.console.write ( "Introduzca su edad: " )
      edad = Int.parseString ( System.console.read ( ) )

      System.console.write ( "Introduzca su teléfono: " )
      telefono = System.console.read ( )

      toret = Persona.copy ( "" )

      toret.putNombre ( nombre )
      toret.putEdad ( edad )
      toret.putTelefono ( telefono )

      Agenda.add ( nombre toret )

      System.console.write ( nombre.concat ( " fue añadido a la agenda ... " ) )
      System.console.lf ( )
      System.console.lf ( )
      return toret
      System.console.write ( "La edad requiere un número." )
      System.console.lf ( )
      System.console.lf ( )
      return Nothing
    endMethod

    method + buscarPersona ( )
      reference nombrePersona
      reference persona

      System.console.write ( "Introduzca un nombre: " )
      nombrePersona = System.console.read ( )

      persona = Agenda.lookUp ( nombrePersona )

      System.console.write ( persona )
      System.console.lf ( )
      System.console.lf ( )
      return Nothing
      System.console.write ( "No se encontró a esa persona." )
      System.console.lf ( )
      System.console.lf ( )
    endMethod

    method + doIt ( )
      reference op
      reference peticion
      reference vectorOpciones = VectorInstance.copy ( "" )
      reference opcionNoValida
      reference numElementos

      ! Inicialización
      vectorOpciones.add ( "1. Añadir persona a la agenda" )
      vectorOpciones.add ( "2. Buscar persona en la agenda" )
      vectorOpciones.add ( "3. Mostrar personas en la agenda" )
      vectorOpciones.add ( "4. Salir" )
      opcionNoValida = "Opción no válida."
      peticion = "Introduzca opción: "
      parent.prepare ( )

      : Loop
      ! Mostrar menú
      numElementos = Agenda.size ( )
      System.console.lf ( )
      vectorOpciones.process ( DisplayByConsoleProcessor )
      System.console.lf ( )
      System.console.lf ( )
      System.console.write ( "Número de personas en la agenda: " )
      System.console.write ( numElementos )
      System.console.lf ( )
      System.console.write ( peticion )

      ! Pedir opción
      op = Int.parseString ( System.console.read ( ) )
      System.console.lf ( )

      ! ¿Es la op final?
      op.isEqualTo ( vectorOpciones.size ( ) )
      jumpOnTrueTo fin

      ! ¿Es la op1?
      op.isEqualTo ( 1 )
      jumpOnTrueTo opcion1

      ! ¿Es la op2?
      op.isEqualTo ( 2 )
      jumpOnTrueTo opcion2

      ! ¿Es la op3?
      op.isEqualTo ( 3 )
      jumpOnTrueTo opcion3

      :opcionInvalida
      System.console.write ( opcionNoValida )
      System.console.lf ( )
      jumpOnTrueTo Loop

      ! Ejecutar cada opcion
      :opcion1
      __this.masPersonas ( )
      jumpOnTrueTo Loop

      :opcion2
      __this.buscarPersona ( )
      jumpOnTrueTo Loop

      :opcion3
      System.console.write ( "Personas en la agenda: " )
      System.console.lf ( )
      numElementos.isEqualTo ( 0 )
      jumpOnTrueTo vacio
      Agenda.process ( DisplayByConsoleProcessor )
      jumpOnTrueTo Loop
      :vacio
      System.console.write ( "No hay personas en la agenda." )
      System.console.lf ( )
      jumpOnTrueTo Loop

      :fin
      System.console.write ( "Fin." )
      System.console.lf ( )
      return Nothing
      isInstanceOf ETypeMismatch
      jumpOnFalseTo errorIndefinido
      System.console.write ( "Es necesario introducir un número." )
      System.console.lf ( )
      jumpOnTrueTo finExcep

      :errorIndefinido
      System.console.write ( "Ocurrió un error no esperado." )
      System.console.lf ( )

      :finExcep
      return Nothing
    endMethod
  endObject