    zenuml
        title Demo

        Alice

        @Database Bob

        J as John

        A.SyncMessage
        A.SyncMessage(with, parameters) {
          B.nestedSyncMessage()
        }

        new A1
        new A2(with, parameters)

        // 1. assign a variable from a sync message.
        a = A.SyncMessage()

        // 1.1. optionally give the variable a type
        SomeType a = A.SyncMessage()

        // 2. use return keyword
        A.SyncMessage() {
          return result
        }

        // 3. use @return or @reply annotator on an async message
        @return
        A->B: result

        Client->A.method() {
          B.method() {
            if(condition) {
              return x1
              // return early
              @return
              A->Client: x11
            }
          }
          return x2
        }

        // a comment on a message.
        // **Markdown** is supported.
        BookService.getBook()

        while(true) {
          John->Alice: Great!
        }

        if(is_sick) {
          Bob->Alice: Not so good :(
        } else {
          Bob->Alice: Feeling fresh like a daisy
        }

        opt {
          Bob->Alice: Thanks for asking
        }

        par {
          Alice->John: Hello guys!
        }

        try {
          Consumer->API: Book something
          API->BookingService: Start booking process
        } catch {
          API->Consumer: show failure
        } finally {
          API->BookingService: rollback status
        }