anchor.diff:      _clickEvent.fireEvent(thing, args);
     }
   
  -  void _doDrag(Thing thing, MouseEvent e) {
  +  void _startDrag(Thing thing, MouseEvent e) {
       assert(!_isDragging);
  -    // todo: implement cancel
  -    e.preventDefault();
  -    _dragCoordinate = new Coordinate(e.clientX, e.clientY);
  +    final args = new ThingDragStartingEventArgs(thing, e);
  +    _dragStartingEvent.fireEvent(thing, args);
  +    if(!args.isCanceled) {
  +      e.preventDefault();
  +      _dragCoordinate = new Coordinate(e.clientX, e.clientY);
  +    }
     }
   
     void _windowMouseMove(MouseEvent e) {
  
positive.code:     for(final t in hits) {
        if(getDraggable(t)) {
          _draggingThing = t;
          _doDrag(_draggingThing, e);
          break;
        } else if(getClickable(t)) {
          _mouseDownThing = t;
  
negative.code:   static final AttachedEvent _mouseOutEvent =
        new AttachedEvent('mouseOut');
  
    static final AttachedEvent<ThingDragStartingEventArgs> _dragStartingEvent =
        new AttachedEvent<ThingDragStartingEventArgs>("_dragStartingEvent");
  
    static final AttachedEvent<Vector> _dragEvent =
        new AttachedEvent<Vector>('_dragStarting');
  
    final Stage _stage;
  
  