digraph g
{
  edge
    [
      fontname="Helvetica",
      fontsize=10,
      labelfontname="Helvetica",
      labelfontsize=10
    ];

  node
    [
      fontname="Helvetica",
      fontsize=10,
      shape=record
    ];

  initiator
    [
      label="Initiator"
    ];

  async_processor
    [
      label="Asynchronous\nOperation Processor"
    ];

  async_op
    [
      label="Asynchronous\nOperation"
    ];

  completion_queue
    [
      label="Completion\nEvent Queue"
    ];

  async_event_demuxer
    [
      label="Asynchronous\nEvent Demultiplexer"
    ];

  proactor
    [
      label="Proactor"
    ];

  handler
    [
      label="Completion\nHandler"
    ];

  initiator -> async_processor
    [
      label="uses",
      style="dashed"
    ];

  initiator -> async_op
    [
      label="starts",
      style="dashed"
    ];

  initiator -> handler
    [
      label="creates",
      style="dashed"
    ];

  async_processor -> async_op
    [
      label="executes",
      style="dashed"
    ];

  async_processor -> completion_queue
    [
      label="enqueues",
      style="dashed"
    ];

  async_op -> handler;

  async_event_demuxer -> completion_queue
    [
      label="dequeues",
      style="dashed"
    ];

  proactor -> async_event_demuxer
    [
    ];

  proactor -> handler
    [
      label="demultiplexes\n& dispatches"
      style="dashed"
    ];
}
