    package flare.util
    {
        import flash.display.BitmapData;
        import flash.display.DisplayObject;
        import flash.display.DisplayObjectContainer;
        import flash.events.Event;
        import flash.geom.Matrix;
        import flash.geom.Point;
        import flash.geom.Rectangle;
        import flash.utils.getDefinitionByName;

        /**
         * Utility methods for working with display objects. The methods include
         * support for panning, rotating, and zooming objects, generating thumbnail
         * images, traversing children lists, and adding stage listeners.
         */
        public class Displays
        {
            private static var _point:Point = new Point();

            /**
             * Constructor, throws an error if called, as this is an abstract class.
             */
            public function Displays()
            {
                throw new Error("This is an abstract class.");
            }

            /**
             * Adds a listener to the stage via a given display object. If the
             * display object has already been added to the stage, the listener
             * will be added to the stage immediately. Otherwise, the listener will
             * be added whenever the display object is added to the stage. This
             * method allows you to add listeners for stage events without having
             * to explicitly manage the case where the defining elements have not
             * yet been added to the stage.
             * @param d the display object through which to access the stage
             * @param eventType the event type
             * @param listener the event listener
             * @param useCapture the event useCapture flag
             * @param priority the event listener priority
             * @param useWeakReference the event useWeakReference flag
             * @return the function that will add the listener to the stage upon
             *  an added to stage event, or null if the listener was directly
             *  added to the stage
             * @see flash.events.Event
             */
            public static function addStageListener(d:DisplayObject,
                eventType:String, listener:Function, useCapture:Boolean=false,
                priority:Number=0, useWeakReference:Boolean=false):Function
            {
                if (d.stage) {
                    d.stage.addEventListener(eventType, listener, useCapture,
                        priority, useWeakReference);
                    return null;
                } else {
                    var add:Function = function(e:Event=null):void
                    {
                        d.stage.addEventListener(eventType, listener,
                            useCapture, priority, useWeakReference);
                        d.removeEventListener(Event.ADDED_TO_STAGE, add);
                        d.stage.invalidate();
                    }
                    d.addEventListener(Event.ADDED_TO_STAGE, add);
                    return add;
                }
            }

            /**
             * Iterates over the children of the input display object container,
             * invoking a visitor function on each. If the visitor function returns
             * a Boolean true value, the iteration will stop with an early exit.
             * @param con the container to visit
             * @param visitor the visitor function to invoke on the children
             * @param filter an optional filter indicating which items should be
             *  visited
             * @param reverse optional flag indicating if the list should be
             *  visited in reverse order
             * @return true if the visitation was interrupted with an early exit
             */
            public static function visitChildren(con:DisplayObjectContainer,
                visitor:Function, filter:*=n