Table of Contents
In part four of this tutorial, we compose a list of users derived from the list of
    issues. Each issue has a user, so we extract all users from all issues to form a new
    list. The derived list is also a EventList so we can apply
    filtering and sorting to it in turn. In part five we use our derived users list to
    filter for issues belonging to a selected user.
Earlier in the tutorial we discussed how Glazed Lists uses events to propagate 
      changes to TransformedLists and widgets. Although this had
      been significant in understanding how EventLists work, it
      was not necessary to interact with the event and listener code directly. In this
      stage we create a custom transformation and require some of the event and listener
      code in the process.
ListEvents are sophisticated event objects. Each event 
      notification may contain information on hundreds of inserts, updates and deletes
      within a list. To simplify the process, the ListEventAssembler
      class assembles and manages ListEvents and their listeners.
      The ListEventAssembler has methods addInsert(index),
      addUpdate(index) and addDelete(index) to
      be called with each list add(), set() and
      remove(), respectively. Finally it has a pair of methods
      beginEvent() and commitEvent() that prepare
      for and fire the event to listeners. To fire an event that is identical to
      the event received, the forwardEvent() method may be used.