package { public class Example extends Sprite { public function Example() { var sprite: AS2Sprite = new AS2Sprite; addChild( sprite.toSprite() ); sprite.clip = new AS2Sprite; sprite.graphics.beginFill( 0xff0000, 1 ); sprite.graphics.drawCircle( 0, 0, 10 ); sprite.graphics.endFill(); sprite._x = 10; sprite._y = 10; sprite.clip.graphics.beginFill( 0x00ff00, 1 ); sprite.clip.graphics.drawCircle( 0, 0, 10 ); sprite.clip.graphics.endFill(); sprite.clip._x = 50; sprite.clip._y = 50; sprite.clip.clip2 = new AS2Sprite; sprite.clip.clip2.graphics.beginFill( 0x0000ff, 1 ); sprite.clip.clip2.graphics.drawCircle( 0, 0, 10 ); sprite.clip.clip2.graphics.endFill(); sprite.clip.clip2._x = 50; sprite.clip.clip2._y = 50; } } } import flash.utils.Proxy; import flash.utils.flash_proxy; import flash.display.DisplayObject; import flash.display.DisplayObjectContainer; import flash.display.Sprite; dynamic class AS2Sprite extends Proxy { protected var sprite: AS2SpriteHandle; public function AS2Sprite() { sprite = new AS2SpriteHandle( this ); } flash_proxy override function callProperty( name: *, ... args ): * { return sprite[ name.toString() ].apply( sprite, args ); } flash_proxy override function getProperty( name: * ): * { if ( sprite.hasOwnProperty( name.toString() ) ) { return sprite[ name.toString() ]; } else { var displayObject: DisplayObject = sprite.getChildByName( name.toString() ); return ( displayObject is AS2SpriteHandle ) ? ( displayObject as AS2SpriteHandle ).handler : displayObject; } } flash_proxy override function setProperty( name: *, value: * ): void { if ( sprite.hasOwnProperty( name.toString() ) ) { sprite[ name.toString() ] = value; return; } switch ( name.toString() ) { case '_x': sprite.x = value; break; case '_y': sprite.y = value; break; case '_xscale': sprite.scaleX = value; break; case '_yscale': sprite.scaleY = value; break; default: var child: DisplayObject = sprite.getChildByName( name ); var nextChild: DisplayObject = ( value is AS2Sprite ) ? ( value as AS2Sprite ).toDisplayObject() : value; if ( child != null ) { if ( nextChild === child ) { return; } else { sprite.removeChild( child ); } } nextChild.name = name; sprite.addChild( nextChild ); } } flash_proxy override function deleteProperty( name: * ): Boolean { if ( sprite.hasOwnProperty( name.toString() ) ) { return false; } switch ( name.toString() ) { case '_x': case '_y': case '_xscale': case '_yscale': return false; default: var child: DisplayObject = sprite.getChildByName( name.toString() ); if ( child != null ) { sprite.removeChild( child ); return true; } return false; } } public function toDisplayObject(): DisplayObject { return sprite; } public function toDisplayObjectContainer(): DisplayObjectContainer { return sprite; } public function toSprite(): Sprite { return sprite; } } class AS2SpriteHandle extends Sprite { protected var _handler: AS2Sprite; public function AS2SpriteHandle( handler: AS2Sprite ) { _handler = handler; } public function get handler(): AS2Sprite { return _handler; } }