docs: function handleElements(now){
          now = +new Date;
  
          var eles = cy._private.aniEles;
          for( var e = 0; e < eles.length; e++ ){
            var ele = eles[e];
            
            // we might have errors if we edit animation.queue and animation.current
            // for ele (i.e. by stopping)
            // try{
  
              var current = ele._private.animation.current;
              var queue = ele._private.animation.queue;
              
              // if nothing currently animating, get something from the queue
              if( current.length === 0 ){
                var q = queue;
                var next = q.length > 0 ? q.shift() : null;
                
                if( next != null ){
                  next.callTime = +new Date; // was queued, so update call time
                  current.push( next );
                }
              }
              
              // step and remove if done
              var completes = [];
              for(var i = 0; i < current.length; i++){
                var ani = current[i];
                step( ele, ani, now );
  
                if( current[i].done ){
                  completes.push( ani );
                  
                  // remove current[i]
                  current.splice(i, 1);
                  i--;
                }
              }
              
              // call complete callbacks
              for( var i = 0; i < completes.length; i++ ){
                var ani = completes[i];
                var complete = ani.params.complete;
  
                if( $$.is.fn(complete) ){
                  complete.apply( ele, [ now ] );
                }
              }
              
            // } catch(e){
            //   // do nothing
            // }
            
          } // each element
          
          
          // notify renderer
          if( eles.length > 0 ){
            cy.notify({
              type: 'draw',
              collection: eles
            });
          }
          
          // remove elements from list of currently animating if its queues are empty
          for( var i = 0; i < eles.length; i++ ){
            var ele = eles[i];
            var queue = ele._private.animation.queue;
            var current = ele._private.animation.current;
            var keepEle = current.length > 0 || queue.length > 0;
            
            if( !keepEle ){ // then remove from the array
              eles.splice(i, 1);
              i--;
            }
          }
  
        }