Net::Gnutella
 |->add_handler
 |->connections
 |->dequeue
 |->do_one_loop
 |->new
 |->new_client
 |->new_server
 |->queue
 |->schedule
 `->start

/* Accepts connections of type Allow (GNUTELLA_CONNECT|GNUTELLA_REQUEST)
 *
 * Instantiates a Connection object
 *
 */
Net::Gnutella::Server
 `->new

/* Perform a non-blocking connect to Server:Port
 *
 * If no Server is specified, attempt to auto-discover
 *
 * Returns a Net::Gnutella::Client object
 */
Net::Gnuetlla::Connection
 |->add_handler # ESTABLISHED
 |->connected   # 0=Not, 1=Outgoing, 2=Incoming, 3=Established, 4=HTTP, 5=Upload
 |->forward     # ESTABLISHED $packet, $route
 |->new
 |->send_error  # HTTP - Disconnect after writing socket
 |->send_file   # Upload - Disconnect after reading from fh fails
 |->send_packet # ESTABLISHED
 `->send_page   # HTTP - Disconnect after writing socket

Net::Gnutella::Packet::Ping
Net::Gnutella::Packet::Pong
Net::Gnutella::Packet::Push
Net::Gnutella::Packet::Query
Net::Gnutella::Packet::Reply
 |->format
 |->parse
 |->hops
 |->msgid
 `->ttl

Net::Gnutella::HTTP::Download
Net::Gnutella::HTTP::Upload

