digraph clientowner {
  ChannelProvider;
  Channel;
  ChannelRequester [shape=box];
  External [shape=box];

  Channel;
  ChannelRequester [shape=box];
  ChannelGet;
  ChannelGetRequester [shape=box];
  ChannelPut;
  ChannelPutRequester [shape=box];
  Monitor;
  MonitorRequester [shape=box];
  ChannelRPC;
  ChannelRPCRequester [shape=box];
  ChannelProcess;
  ChannelProcessRequester [shape=box];
  ChannelPutGet;
  ChannelPutGetRequester [shape=box];
  ChannelArray;
  ChannelArrayRequester [shape=box];

  Channel -> ChannelProvider [color=green, style=dashed];
  ChannelProvider -> Channel [color=green, style=dashed];

  # Operation -> Requester  weak ref
  Channel -> ChannelRequester [color=green, style=dashed];
  ChannelGet -> ChannelGetRequester [color=green, style=dashed];
  ChannelPut -> ChannelPutRequester [color=green, style=dashed];
  Monitor -> MonitorRequester [color=green, style=dashed];
  ChannelRPC -> ChannelRPCRequester [color=green, style=dashed];
  ChannelProcess -> ChannelProcessRequester [color=green, style=dashed];
  ChannelPutGet -> ChannelPutGetRequester [color=green, style=dashed];
  ChannelArray -> ChannelArrayRequester [color=green, style=dashed];

  # Channel -> Operation  weak ref
  Channel -> ChannelGet [color=green, style=dashed];
  Channel -> ChannelPut [color=green, style=dashed];
  Channel -> Monitor [color=green, style=dashed];
  Channel -> ChannelRPC [color=green, style=dashed];
  Channel -> ChannelProcess [color=green, style=dashed];
  Channel -> ChannelPutGet [color=green, style=dashed];
  Channel -> ChannelArray [color=green, style=dashed];

  # Operation -> Channel  strong ref
  ChannelGet -> Channel [color=red, style=dashed];
  ChannelPut -> Channel [color=red, style=dashed];
  Monitor -> Channel [color=red, style=dashed];
  ChannelRPC -> Channel [color=red, style=dashed];
  ChannelProcess -> Channel [color=red, style=dashed];
  ChannelPutGet -> Channel [color=red, style=dashed];
  ChannelArray -> Channel [color=red, style=dashed];

  # user code ownership
  External -> ChannelProvider [color=red];
  External -> ChannelRequester [color=red];
  External -> ChannelGetRequester [color=red];
  External -> ChannelPutRequester [color=red];
  External -> MonitorRequester [color=red];
  External -> ChannelRPCRequester [color=red];
  External -> ChannelProcessRequester [color=red];
  External -> ChannelPutGetRequester [color=red];
  External -> ChannelArrayRequester [color=red];

  ChannelRequester -> Channel [color=red];
  ChannelGetRequester -> ChannelGet [color=red];
  ChannelPutRequester -> ChannelPut [color=red];
  MonitorRequester    -> Monitor [color=red];
  ChannelRPCRequester -> ChannelRPC [color=red];
  ChannelProcessRequester -> ChannelProcess [color=red];
  ChannelPutGetRequester -> ChannelPutGet [color=red];
  ChannelArrayRequester -> ChannelArray [color=red];
}
