These need to be implemented twice, as a pair of complementary classes. It is often worth building a common ancestor to avoid duplicating code and to ensure consistency, and this pattern crops up occasionally in the pipework library. The plumbing analogy is useful for an overall perspective, but computing terminology is more appropriate for identifying components precisely. The dominant features of these components are concerned with reading, writing and connecting. The names of the principle abstractions were chosen with some hesitation, but have turned out to be appropriate.
Readers connect to other readers, and writers connect to other writers.
Most classes use one of the words source, drain, reader or writer as a prefix or suffix. The type of object passing through the pipe might also be included, where the pipe is not generic. In general, natural sounding names are preferred over formal classification. At the heart of the 'Reader' protocol is a pair of features implementing a pattern familiar to all Eiffel developers. If you call 'read' repeatedly objects are made available one by one until the source is exhausted.