def add_pipe(self, pipe, branch=None):
<EOL>self.log.debug('<STR_LIT>' % (repr(self), repr(pipe)))<EOL>for i in range(len(pipe) - <NUM_LIT:1>):<EOL><INDENT>edge = (pipe[i + <NUM_LIT:1>], pipe[i])<EOL>edge = (self.add_piper(edge[<NUM_LIT:0>], create=True, branch=branch)[<NUM_LIT:1>],self.add_piper(edge[<NUM_LIT:1>], create=True, branch=branch)[<NUM_LIT:1>])<EOL>if edge[<NUM_LIT:0>] in self.dfs(edge[<NUM_LIT:1>], []):<EOL><INDENT>self.log.error('<STR_LIT>' %(repr(self), edge[<NUM_LIT:0>], edge[<NUM_LIT:1>]))<EOL>raise DaggerError('<STR_LIT>' %(repr(self), edge[<NUM_LIT:0>], edge[<NUM_LIT:1>]))<EOL><DEDENT>self.add_edge(edge)<EOL>self.clear_nodes() <EOL>self.log.debug('<STR_LIT>' %(repr(self), edge[<NUM_LIT:0>], edge[<NUM_LIT:1>]))<EOL><DEDENT>
Adds a pipe (A, ..., N) which is an N-``tuple`` tuple of ``Pipers`` 
instances. Adding a pipe means to add all the ``Pipers`` and connect 
them in the specified left to right order.

The direction of the edges in the ``DictGraph`` is reversed compared to 
the left to right data-flow in a pipe.

Arguments:

  - pipe(sequence) N-``tuple`` of ``Piper`` instances or objects which 
    are valid  ``add_piper`` arguments. See: ``Dagger.add_piper`` and 
    ``Dagger.resolve``.