digraph G {
  orientation=landscape;
  nodesep=.10;

  node [shape=box, fontsize=12];
// Clustering
  subgraph cluster0 {
     tic_board;
     tic_move;
     tic_move_gen;
     label = "tic-tac-toe game"  
  }

  subgraph cluster1 {
     antichess_board;
     chess_display_board;
     chess_capture_move;
     antichess_move_gen;
parse_square [shape=ellipse];
     label = "antichess game"  
  }

// Procedural abstractions:
parse_query [shape=ellipse];
unescape_uri [shape=ellipse];

// Inheritance (subclassing)
  edge [style=bold];   //weight=3
  top_node -> dir_node -> web_node;
  machine_player -> player -> web_node;
  human_player -> player;
  antichess_board -> chess_display_board -> board -> web_node;
  chess_capture_move -> move;
  antichess_move_gen -> move_generator;
  game -> web_node;
  tic_move -> move;
  tic_move_gen -> move_generator;
  tic_board -> board;

// Strong dependencies
  edge [dir=forward,style=solid];
web_node -> unescape_uri [label = "used by children"];
web_node -> parse_query [label = "used by children"];

  game -> board;
  game -> player;
  game -> move;
  top_node -> antichess_board;
  top_node -> tic_board;
  top_node -> game;
  top_node -> machine_player;
  top_node -> human_player;
  antichess_board -> chess_capture_move;
  antichess_board -> antichess_move_gen;
  antichess_board -> game;
  antichess_board -> player;
  antichess_move_gen -> antichess_board;
  antichess_move_gen -> chess_capture_move;
  chess_capture_move -> chess_display_board;
  chess_display_board -> game;
chess_display_board->chess_capture_move;
chess_display_board -> parse_square;
  tic_board -> tic_move;
  tic_board -> tic_move_gen;
  tic_board -> game;
  tic_board -> player;
  tic_move_gen -> tic_board;
  tic_move_gen -> tic_move;
  tic_move -> tic_board;
  board -> game;
  human_player -> top_node;
  human_player -> game;
  player -> game;  

  
// Weak dependencies
  edge [style=dotted,weight=1];
  board -> game;  
  player -> move;
  board -> player;

// Omitted for clarity
//  new_typeinfo [label="new_typeinfo\n(Dependencies omitted\nfor clarity)",
//                fontsize=10];
//  http_response[label="http_response\n(Dependencies omitted\nfor clarity)",
//                fontsize=10];
}
