digraph g {
  graph [compound = true];
  //presentation
  splines = true;
  overlap = false;
  rankdir = TB;
  subgraph cluster_generators {
    label="generators";
    style="dotted";
    generators_twitter [label="https://api.twitter.com"]
  }
  subgraph cluster_providers {
    label="providers";
      providers_twitter_userstream [label="TwitterUserstreamProvider"]
      providers_twitter_userinfo [label="TwitterUserInformationProvider"]
      providers_twitter_timeline [label="TwitterTimelineProvider"]
      providers_twitter_following [label="TwitterFollowingProvider"]
  }
  subgraph cluster_processors {
    label="processors";
    processors_twitter_activity [label="ActivityConverterProcessor"]
    processors_twitter_activityobject [label="ActivityObjectConverterProcessor"]
  }
  persisters [label="persisters", shape="cylinder"];
  generators_twitter -> providers_twitter_userstream
  generators_twitter -> providers_twitter_timeline
  generators_twitter -> providers_twitter_following
  generators_twitter -> providers_twitter_userinfo
  providers_twitter_userinfo -> processors_twitter_activityobject [label="o.a.s.t.User"]
  providers_twitter_userstream -> processors_twitter_activity [label="o.a.s.t.Tweet"]
  providers_twitter_timeline -> processors_twitter_activity [label="o.a.s.t.Tweet"]
  providers_twitter_following -> processors_twitter_activity [label="o.a.s.t.Follow"]
  processors_twitter_activityobject -> persisters [label="o.a.s.p.j.Page"]
  processors_twitter_activity -> persisters [label="o.a.s.p.j.Post\no.a.s.p.j.Share\no.a.s.p.j.Follow"]
}