     {
         autoRepeatTimer.stop();
         autoRepeatTimer = null;
+    }
+
+    /**
+     *  This method is called when handling a MouseEvent.MOUSE_UP event
+     *  when the user clicks on the button. It is only called when the button
+     *  is the target and when mouseCaptured is true. It allows subclasses
+     *  to update the properties of the button right as it is clicked to
+     *  avoid the button being in transitional states between the mouse up
+     *  and click events.
+     *  
+     *  @langversion 3.0
+     *  @playerversion Flash 10
+     *  @playerversion AIR 1.5
+     *  @productversion Flex 4
+     */
+    protected function buttonReleased():void
+    {
     }
 
     //--------------------------------------------------------------------------


            case MouseEvent.MOUSE_UP:
            {
                if (event.currentTarget == this)
                    hovered = true;
            } //fallthrough:
            case SandboxMouseEvent.MOUSE_UP_SOMEWHERE:
            {
                mouseCaptured = false;
                break;
            }


            
            case MouseEvent.MOUSE_DOWN:
            {
                // When the button is down we need to listen for mouse events outside the button so that
                // we update the state appropriately on mouse up.  Whenever mouseCaptured changes to false,
                // it will take care to remove those handlers.
                addSystemMouseHandlers();
