How does that whole "pipe entire objects back and forth" thing work? I mean it seems that there must be some huge machinery to facilitate that kind of thing. For example, if I pipe object from my program to another, how does the other program know what to expect? It must have some sort of type information available, which imposes some pre-planning.
Also, when I pipe an object to another program, can the receiver call methods on it and are the changes visible to the sender?