      */
     private function compose(width:Number = NaN, height:Number = NaN):Boolean
     {
+        // Don't want this handler firing when we're re-composing the text lines.
+        textFlow.removeEventListener(DamageEvent.DAMAGE, textFlow_damageHandler);
+                
         textFlow = createTextFlow();
         _content = textFlow;
 

     */
    private var textInvalid:Boolean = false;
        
    //--------------------------------------------------------------------------
    //
    //  Overridden properties

        
        textFlowComposer.addTextLines(DisplayObjectContainer(displayObject));

        // Just recomposed so reset.
        stylesChanged = false;
        
        // Listen for "damage" events in case the textFlow is 
        // modified programatically.
        textFlow.addEventListener(DamageEvent.DAMAGE, textFlow_damageHandler);        

        return textFlowComposer.isOverset;
    }
    
    //--------------------------------------------------------------------------
    //
    //  Event handlers
    //
    //--------------------------------------------------------------------------
    
    /**
     *  @private
     *  Called when the TextFlow dispatches a 'damage' event
     *  to indicate it has been modified.
     */
    private function textFlow_damageHandler(
                            event:DamageEvent):void
    {
        //trace("damageHandler", "damageStart", event.damageStart, "damageLength", event.damageLength);
                
        // The text flow changed.  It could have been either/or content or
        // styles within the flow.
        contentChanged = true;
        stylesChanged = true;

        // Unless both width/height were specified, need to recalc size.
        if (isNaN(explicitWidth) || isNaN(explicitHeight))
            invalidateSize();
        
        invalidateDisplayList();  
    }    
}

}
