Connects ``Pipers`` in the order input -> output. See ``Piper.connect``.
        According to the pipes (topology). If "datas" is given will connect the
        input ``Pipers`` to the input data see: ``Dagger.connect_inputs``.
        
        Argumensts:
        
          - datas(sequence) [default: ``None``] valid sequence of input data.
            see: ``Dagger.connect_inputs``.

def connect(self, datas=None):
        """
        Connects ``Pipers`` in the order input -> output. See ``Piper.connect``.
        According to the pipes (topology). If "datas" is given will connect the
        input ``Pipers`` to the input data see: ``Dagger.connect_inputs``.
        
        Argumensts:
        
          - datas(sequence) [default: ``None``] valid sequence of input data.
            see: ``Dagger.connect_inputs``.
          
        """
        # if data connect inputs
        if datas:
            self.connect_inputs(datas)
        # connect the remaining pipers
        postorder = self.postorder()
        self.log.debug('%s trying to connect in the order %s' % \
                      (repr(self), repr(postorder)))
        for piper in postorder:
            if not piper.connected and self[piper].nodes():
                # 1. sort inputs by index in postorder
                inputs = [p for p in postorder if p in self[piper].nodes()]
                # 2. sort postorder so that all parents come before children
                # mind that the top of a pipeline is a child!
                inputs.sort(cmp=self.children_after_parents)
                # 2. branch age sorted inputs
                piper.connect(inputs)
        self.log.debug('%s succesfuly connected' % repr(self))