anchor.diff:      // not a child of the element the event was attached to
       if((event.currentTarget as Element).contains(event.fromElement)) return;
       
  +    _logger.fine("got mouse over event for ${event.currentTarget.hashCode}");
  +    
       // do actual start in case we were pending before
       _pendingToDrag();
       
  
positive.code:     // stop the drag
      // only call if we are currently dragging and enabled
      if((_dragStartPending || _dragging) && enabled) {
        stopDrag(event);
      }
    }
    
    /// Manually end the drag
    void stopDrag([MouseEvent event]) {
      
      // signal that we are no longer dragging
      _dragging = false;
  
negative.code:       // remove down handler
        _cancel("mouseDown", element);
        _targets.remove(element);
        _logger.finer("removing ${element.hashCode} and cancelling mouse down");
      }
      if(_overTargets.contains(element)) {
        // TOD if have subscribers?
        _cancel("mouseOver", element);
        _overTargets.remove(element);
        _logger.finer("removing ${element.hashCode} and cancelling mouse over");
      }
      if(_outTargets.contains(element)) {
        _cancel("mouseOut", element);
        _outTargets.remove(element);
        _logger.finer("removing ${element.hashCode} and cancelling mouse out");
      }
    }
    /// Remove targets from the set
    void removeTargets(List<Element> elements) {
      _logger.fine("removing ${elements.length} elements");
      for(Element element in elements) {
        removeTarget(element);
      }
    }
    /// Remove all targets
    void removeAllTargets() {
      _logger.fine("removing all elements");
      removeTargets(new List.from(_targets));
      // TODO need to remove all from out and over as well
    }
    
    // The element that the current drag started on
  