As I mentioned before [1], I like the code, and the examples of manipulation of graphs.
Just a couple of comments/questions:
- Might be better to use "return PEAR::raiseError()"
- Did you think it'll be a good idea to have "Edge" objects? In case you need some metainfo associated with one of them (e.g. a cost value) to be used in a particular manipulation (e.g. find the shortest/less costly path through a graph)