显示具有 ApplicationDomain 标签的文章。 显示所有文章
显示具有 ApplicationDomain 标签的文章。 显示所有文章

2008年6月18日 星期三

Flex SDK 马歇尔计画   [+/-]

Ticore's Blog

Marshall Plan 原文有点长,主要只有两件事情:

  • 不同版本交互支持 (Cross-Versioning):
    不同版本 Flex 编译的 SWFs 可以被放在相同的 SecurityDomain 运行
    但是却可以有不同的 ApplicationDomain

  • 不信任的应用程序支持 (Untrusted Application):
    被装入到不同 SecurityDomain 的 SWFs 将不能访问主应用程序或是 Stage 与其它受限的资源

这个计画将可能会在 Flex 3.1 开始支持
未来不同版本的 Flex 应用程序可以做混搭了
个人猜测,这计画背后更重要的意义是 Flash 与 Flex 应用程序混搭

不过在那之前,Adobe 可能要先把 ApplicationDomain 的 Bug 处理掉吧~

Read more...

2008年5月28日 星期三

Flex - RemoteObject 与 ApplicationDomain 问题   [+/-]

Ticore's Blog

问题出处:SWFLoader装入问题,当要装入的swf有使用DataServices...
在 Flex App 内,以新的 ApplicationDomain 装入另一个 Flex App 之后
被读入的 Flex App 使用 RemoteObject 调用会出现问题

重新把问题程序码简化如下
因为这问题发生于 HTTP 请求之前,不必配置后端

LoadeeApp.mxml:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">
 <mx:Button label="Submit" click="remoteObj.test(123);"/>
 <mx:RemoteObject id="remoteObj" destination="xxx" />
</mx:Application>
<!-- Ticore's Blog - http://ticore.blogspot.com/ -->

LoaderApp.mxml:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
 <mx:SWFLoader id="swfLdr" width="100%" height="100%">
  <mx:creationComplete>
   <![CDATA[
    swfLdr.loaderContext = new LoaderContext();
    swfLdr.loaderContext.applicationDomain = new ApplicationDomain();
    swfLdr.source = "LoadeeApp.swf";
   ]]>
  </mx:creationComplete>
 </mx:SWFLoader>
</mx:Application>
<!-- Ticore's Blog - http://ticore.blogspot.com/ -->

编译之后,运行 LoaderApp,按下按钮就会得到错误消息

ArgumentError: Error #1063:
 Object/http://adobe.com/AS3/2006/builtin::hasOwnProperty()
 上的引数个数不相符。需要 0 个,当前为 2 个。
 at LoadeeApp/___LoadeeApp_Button1_click()

假如改成 remoteObj.test(); 还会得到堆栈溢位错误呢

Error: Error #1023: 发生堆栈溢位。
 at Object$/_hasOwnProperty()
 at Object/http://adobe.com/AS3/2006/builtin::hasOwnProperty()
 at Object$/_hasOwnProperty()
 at Object/http://adobe.com/AS3/2006/builtin::hasOwnProperty()
 ...

从错误消息看起来,其实与 Flex 无关
问题很可能是出在 Flash ActionScript 3.0 内建 Class 上
由于 RemoteObject 是继承 Proxy
再将问题简化,剔除 Flex 相关的因素
仅使用 Flash ActionScript 3.0 以 new ApplicationDomain(); 装入另一个 Flash App
于被装入的 Flash App 调用自订的 MyProxy 方法

LoaderFlash Class:

package {
 import flash.display.Loader;
 import flash.display.Sprite;
 import flash.net.URLRequest;
 import flash.system.ApplicationDomain;
 import flash.system.LoaderContext;

 public class LoaderFlash extends Sprite {
  
  protected var ldr:Loader;
  protected var ldrCxt:LoaderContext;
  protected var req:URLRequest;
  
  public function LoaderFlash() {
   ldr = new Loader();
   ldrCxt = new LoaderContext(false, new ApplicationDomain());
   req = new URLRequest("LoadeeFlash.swf");
   
   ldr.load(req, ldrCxt);
  }
 }
}
// Ticore's Blog - http://ticore.blogspot.com/

LoadeeFlash Class:

package {
 import flash.display.Sprite;

 public class LoadeeFlash extends Sprite {
  public function LoadeeFlash() {
   var proxy:MyProxy = new MyProxy();
   proxy.test(123);
   //proxy.prop++;
  }
 }
}
// Ticore's Blog - http://ticore.blogspot.com/

MyProxy Class:

package {
 import flash.utils.Proxy;
 import flash.utils.flash_proxy;

 public dynamic class MyProxy extends Proxy {
  public function MyProxy() {
   super();
  }
  override flash_proxy function callProperty(methodName:*, ... args):* {
   trace("callProperty :", methodName, args);
   return;
  }
  override flash_proxy function getProperty(name:*):* {
   trace("getProperty :", name);
   return;
  }
  override flash_proxy function hasProperty(name:*):Boolean{
   trace("hasProperty :", name);
   return true;
  }
 }
}
// Ticore's Blog - http://ticore.blogspot.com/

下载测试程序码

运行 LoaderFlash.swf,结果还是会得到一样的错误消息
所以 flash.utils.Proxy 无法在 new ApplicationDomain(); 方式装入的 SWF 内使用

变通方式,大概只能避免使用到 Proxy 的功能了
改以 NetConnection 等比较低阶的方式使用 Remoting 功能

以上的 Bug 至少会发生在以下版本的 Flash Player
Flash Player 9.0.115.0
Flash Player 9.0.124.0
Flash Player 10.0.0.525
Flash Player 10.0.1.218
Flash Player 10.0.12.10

Read more...

2007年9月8日 星期六

AS3 技巧 - 快速取得 LoaderInfo.url   [+/-]

Ticore's Blog

在 ActionScript 3.0 已经无法像以前一样
直接取用 _url 就可以得到本身 SWF 的 URL 位置
必须要从 DisplayObject.loaderInfo.url 获得
对于一个非 DisplayObject 对象来说
要得到 url 实在很麻烦
要先取得一个 DisplayObject,还要确保该对象有 loaderInfo ......

以下介绍一个关于 LoaderInfo 的高级技巧
可以直接取得当前 SWF URL 位置
不管在什么位置,不管是否可以取得 DisplayObject.loaderInfo
直接 new LoaderInfo,然后取得该对象 url 便是了

trace(new flash.display.LoaderInfo().url);

这是根据 LoaderInfo.url 变动性而来
以下配合实际例子示范:

Main Document Class:Main.as

package {
 import flash.display.*;
 import flash.net.*;
 import flash.events.*;
 import flash.system.*;

 public class Main extends MovieClip {
  
  public var app:ApplicationDomain = ApplicationDomain.currentDomain;
  
  public var ldr:Loader = new Loader();
  public var lcxt:LoaderContext = new LoaderContext(false, app);
  public var req:URLRequest = new URLRequest("Lib.swf");
  
  public function Main() {
   ldr.contentLoaderInfo.addEventListener(Event.INIT, onLibInit);
   ldr.load(req, lcxt);
  }
  
  public function onLibInit(evtObj:Event):void {
   var fun:* = app.getDefinition("Fun");
   trace(fun());
  }
 }
}

Lib Document Class:Lib.as

package {
 import flash.display.*;
 
 public class Lib extends MovieClip {
  (Fun);
 }
}

Package Function:Fun.as

package {
 import flash.display.*;
 public function Fun():String {
  return new LoaderInfo().url;
 }
}

Lib.as 只是一个外壳,主要是将 Fun.as 编译到 SWF 内

分别将 Main、Lib 编译为 SWF 之后
运行 Main.swf,便会动态装入 Lib.swf
并调用定义在 Lib.swf 内的 Package Function - Fun
得到 Lib.swf URL

需要注意 new LoaderInfo() 动作无法在之后的 Flash Player 版本运行
Flash Player 9.0.64.0
Flash Player 9.0.60.120
Flash Player 9.0.60.184
Flash Player 9.0.60.235
Flash Player 9.0.115.0
Flash Player 9.0.124.0

Flash Player update 3 之后可以改用新方法 LoaderInfo.getLoaderInfoByDefinition 取得

相关连结:
AS3 DisplayObject 四大变动属性
AS3 诡谲多变的 LoaderInfo (1)
AS3 诡谲多变的 LoaderInfo (2)

Read more...

AS3 诡谲多变的 LoaderInfo (2)   [+/-]

Ticore's Blog

在前一篇介绍了 LoaderInfo 固定性与变动性
接下来再进一步考虑比较复杂的情况

假如 MC3 Class 继承 MC2 Class,MC2 Class 又继承 MC1 Class
而这三个 Class 定义分别来自三个不同的 SWF
对于一个 MC3 Instance 调用定义在 MC1、MC2、MC3 Function 测试 LoaderInfo.url 会有什么结果?

Lib1 Document Class:

package {
 import flash.display.*;
 public class Lib1 extends MovieClip {
  (MC1);
 }
}

MC1 Class:

package {
 import flash.display.*;
 public class MC1 extends MovieClip {
  
  public function showURL():void {
   trace("MC1.loaderInfo();");
   trace(" url:" + loaderInfo.url);
   trace(" loaderURL:" + loaderInfo.loaderURL);
   trace(" width:" + loaderInfo.width);
  }
 }
}

Lib2 Document Class:

package {
 import flash.display.*;
 public class Lib2 extends MovieClip {
  (MC2);
 }
}

MC2 Class:

package {
 import flash.display.*;
 public class MC2 extends MC1 {
  
  public override function showURL():void {
   super.showURL();
   trace("MC2.loaderInfo();");
   trace(" url:" + loaderInfo.url);
   trace(" loaderURL:" + loaderInfo.loaderURL);
   trace(" width:" + loaderInfo.width);
  }
 }
}

Lib3 Document Class:

package {
 import flash.display.*;
 public class Lib3 extends MovieClip {
  (MC3);
 }
}

MC3 Class:

package {
 import flash.display.*;
 public class MC3 extends MC2 {
  
  public override function showURL():void {
   super.showURL();
   trace("MC3.loaderInfo();");
   trace(" url:" + loaderInfo.url);
   trace(" loaderURL:" + loaderInfo.loaderURL);
   trace(" width:" + loaderInfo.width);
  }
 }
}

Main Document Class:

package {
 import flash.display.*;
 import flash.net.*;
 import flash.events.*;
 import flash.system.*;
 import flash.utils.*;

 public class Main extends MovieClip {
  
  var app:ApplicationDomain;

  var ldr1:Loader;
  var ldr2:Loader;
  var ldr3:Loader;
  
  var req1:URLRequest;
  var req2:URLRequest;
  var req3:URLRequest;
  
  var lcxt1:LoaderContext;
  var lcxt2:LoaderContext;
  var lcxt3:LoaderContext;
  
  public function Main() {
   
   init();
   loadLib1();

  }
  
  public function init() {
   
   app = ApplicationDomain.currentDomain;
   
   ldr1 = new Loader();
   ldr2 = new Loader();
   ldr3 = new Loader();
   
   req1 = new URLRequest("Lib1.swf");
   req2 = new URLRequest("Lib2.swf");
   req3 = new URLRequest("Lib3.swf");
   
   lcxt1 = new LoaderContext(false, app);
   lcxt2 = new LoaderContext(false, app);
   lcxt3 = new LoaderContext(false, app);
   
   ldr1.contentLoaderInfo.addEventListener(Event.INIT, onLib1Init);
   ldr2.contentLoaderInfo.addEventListener(Event.INIT, onLib2Init);
   ldr3.contentLoaderInfo.addEventListener(Event.INIT, onLib3Init);
   
  }
  public function loadLib1() {
   trace("loadLib1();");
   ldr1.load(req1, lcxt1);
   stop();
  }
  
  public function loadLib2() {
   trace("loadLib2();");
   ldr2.load(req2 ,lcxt2);
   stop();
  }
  
  public function loadLib3() {
   trace("loadLib3();");
   ldr3.load(req3 ,lcxt3);
   stop();
  }
  
  public function onLib1Init(evtObj:Event):void {
   trace("onLib1Init();");
   loadLib2();
  }
  
  public function onLib2Init(evtObj:Event):void {
   trace("onLib2Init();");
   loadLib3();
  }
  
  public function onLib3Init(evtObj:Event):void {
   trace("onLib3Init();");
   
   var mcClass:* = app.getDefinition("MC3");
   var mcIns:* = new mcClass();
   this.addChild(mcIns);
   mcIns.showURL();
   
  }
 }
}

以上 Lib 1~3 都是用来承载 MC 1~3 Class
需要注意最好将 Libs 分别放在不同的 Folder
Lib1 输出 SWC 添加 Lib2 Classpath
Lib2 输出 SWC 添加 Lib3 Classpath
避免 Class 重复编译

运行 Main.swf 可以得到输出结果

loadLib1();
onLib1Init();
loadLib2();
onLib2Init();
loadLib3();
onLib3Init();
MC1.loaderInfo();
 url:file:///C|/......../Lib1.swf
 loaderURL:file:///C|/......../Lib1.swf
 width:400
MC2.loaderInfo();
 url:file:///C|/......../Lib2.swf
 loaderURL:file:///C|/......../Lib2.swf
 width:400
MC3.loaderInfo();
 url:file:///C|/......../Lib3.swf
 loaderURL:file:///C|/......../Lib3.swf
 width:400

由输出结果可以发现,对于同一个 MC3 Instance 而言
调用 Super Class 方法测试自身同一个 LoaderInfo 对象
得到结果是依据 Class Definition 位置而变

相关连结:
AS3 DisplayObject 四大变动属性
AS3 诡谲多变的 LoaderInfo (1)
AS3 技巧 - 快速取得 LoaderInfo.url

Read more...

AS3 诡谲多变的 LoaderInfo (1)   [+/-]

Ticore's Blog

之前已经在 AS3 DisplayObject 四大变动属性
介绍过 DisplayObject.loaderInfo 变动性
不过 LoaderInfo 诡异特性可不祇这样而已~

依据 LoaderInfo 本身变动性,还可以分为「固定的 LoaderInfo」与「不固定的 LoaderInfo」两种

所谓固定的 LoaderInfo,指对于同一个 LoaderInfo 实体而言
LoaderInfo.url 属性不会变动
反之,不固定的 LoaderInfo,LoaderInfo.url 属性则会随着 caller 位置变动

一般情况下取得 LoaderInfo 大多是不固定的
而透过 Loader.contentLoaderInfo 也就是 Loader.content.loaderInfo 取得的
则是固定的 LoaderInfo

说到这,可能让一些人非常震惊
因为文档上并没有提到这特性
结果都当作一般对象行为处里

以下做个简单的测试

Main Document Class:Main.as

package {
 import flash.display.*;
 import flash.net.*;
 import flash.events.*;
 import flash.system.*;

 public class Main extends MovieClip {
  
  public var app:ApplicationDomain = ApplicationDomain.currentDomain;
  
  public var ldr:Loader = new Loader();
  public var lcxt:LoaderContext = new LoaderContext(false, app);
  public var req:URLRequest = new URLRequest("Lib.swf");
  
  public function Main() {
   this.addChild(ldr);
   ldr.contentLoaderInfo.addEventListener(Event.INIT, onLibInit);
   ldr.load(req, lcxt);
  }
  
  public function onLibInit(evtObj:Event):void {
   
   ldr.content["test"]("Lib Test Main.loaderInfo", root.loaderInfo);
   // Lib Test Main.loaderInfo
   // url : file:///C|/........../Lib.swf
   // loaderURL : file:///C|/........../Lib.swf
   
   var ldrInfo:LoaderInfo = new LoaderInfo();
   
   test("Main Test Main.new loaderInfo", ldrInfo);
   // Main Test Main.new loaderInfo
   // url : file:///C|/........../Main.swf
   // loaderURL : file:///C|/........../Main.swf
   
   ldr.content["test"]("Lib Test Main.new loaderInfo", ldrInfo);
   // Lib Test Main.new loaderInfo
   // url : file:///C|/........../Lib.swf
   // loaderURL : file:///C|/........../Lib.swf
   
  }
  
  public function test (msg:String, ldrInfo:LoaderInfo):void {
   trace(msg);
   trace("url : " + ldrInfo.url);
   trace("loaderURL : " + ldrInfo.loaderURL);
  }
 }
}

Lib Document Class:Lib.as

package {
 import flash.display.*;
 import flash.events.Event;
 
 public class Lib extends MovieClip {
  
  public function Lib () {
   this.addEventListener(Event.ADDED_TO_STAGE, onAddStage);
  }
  
  public function onAddStage (evtObj:Event):void {
   
   parent.parent["test"]("Main Test Lib.loaderInfo", loaderInfo);
   // url : file:///C|/........../Lib.swf
   // loaderURL : ffile:///C|/........../Main.swf
   
  }
  
  public function test (msg:String, ldrInfo:LoaderInfo):void {
   trace(msg);
   trace("url : " + ldrInfo.url);
   trace("loaderURL : " + ldrInfo.loaderURL);
  }
 }
}

需要注意 new LoaderInfo() 动作无法在新的 Flash Player Beta 版运行
Flash Player 9.0.60.120
Flash Player 9.0.60.184
Flash Player 9.0.115.0
Flash Player 9.0.124.0

相关连结:
AS3 DisplayObject 四大变动属性
AS3 诡谲多变的 LoaderInfo (2)
AS3 技巧 - 快速取得 LoaderInfo.url

Read more...

2007年7月19日 星期四

RSL Document Class 实体化造成 Player Crash Bug   [+/-]

Ticore's Blog

又是一个会造成 Flash Player 9 Crash 的 Bug
当利用 ApplicationDomain 读取外部 Runtime Shared Library (RSL) 完毕后
在 Main Movie 取得 RSL Document Class 之后,加以实体化
就会造成 Fash Player 9 Crash 了

RSL Document Class 内无特别的程序
但是要让 Bug 触发,需要在 RSL Stage 上随便画一点东西

RSL Document Class:

package {
 import flash.display.*;
 public class rsl extends MovieClip {
 }
}

Main Document Class:

package {
 import flash.display.*;
 import flash.net.*;
 import flash.events.*;
 import flash.system.*;
 import flash.errors.*;
 
 public class main extends MovieClip {
  
  private var rslLoader:Loader;
  
  public function main():*{
   init();
  }
  
  public function init():*{
   rslLoader = new Loader();
   var req:URLRequest = new URLRequest("rsl.swf");
   var lcxt:LoaderContext = new LoaderContext(false, ApplicationDomain.currentDomain);
   rslLoader.contentLoaderInfo.addEventListener(Event.INIT, onLoadInit);
   rslLoader.load(req, lcxt);
  }
  
  public function onLoadInit(evtObj:Event):*{
   try {
    var rsl:Class = ApplicationDomain.currentDomain.getDefinition("rsl") as Class;
    new rsl();
   } catch (e:Error) {
    trace(e);
   }
  }
 }
}

这个 Bug 在以下版本 Flash Player 测试过会发生:
Flash Player 9.0.28.0
Flash Player 9.0.47.0
Flash Player 9.0.60.120

Flash Player 9.0.60.235 之后已经对此作修正

相关连结:
AS3 Document Class 实体化怪异现象
利用 static 区块创建额外 Document Class 实体

Read more...

2006年12月18日 星期一

文档翻译 - AS3 ApplicationDomain Class   [+/-]

Ticore's Blog

ActionScript 3.0 添加了类别定义域的管理功能
可以做到运行期动态加载外部类别定义(RSL)、外部模块的加载卸载...等
不像 AS 2 的 RSL 是定死的

对于开发 application 来说,是不可或缺的功能之一
这全靠 ApplocationDomain Class
以下便是文档上的翻译


Flex 2 Live Docs - ApplicatonDomain Class

ApplicationDomain 类别的目的是用来保存 ActionScript 3.0 类别定义,swf 文件内所有的程序码都定义在一个既存的 application domain 内。你可以使用 application domain 分隔在同一个 security domain 下的类别,这样可以允许一个既存类别具有多重定义也可以让子程序重复使用父程序的定义。

当你用 ActionScript 3.0 Loader 类别 API 读取一个外部的 SWF 文件时可以使用 application domains (当读取一个图片或是 ActionScrip 1.0、2.0 SWF 文件时无法使用 application domain) 。当读取 SWF 文件时,你可以藉由设置 LoaderContext.applicationDomain 使该文件被包含进入与 Loader 对象相同的 application domain,将 SWF 文件放入相同的 application domain 之后,你便可以直接访问它的类别。

这是很有用处的,假如当你读取一个包含媒体的 SWF 文件,你可以透过关联的类别名称访问,或者你想要访问 SWF 文件的方法,如下所示:

package {
    import flash.display.Loader;
    import flash.display.Sprite;
    import flash.events.*;
    import flash.net.URLRequest;
    import flash.system.ApplicationDomain;
    import flash.system.LoaderContext;

    public class ApplicationDomainExample extends Sprite {
        private var ldr:Loader;
        public function ApplicationDomainExample() {
            ldr = new Loader();
            var req:URLRequest = new URLRequest("Greeter.swf");
            var ldrContext:LoaderContext = new LoaderContext(false, ApplicationDomain.currentDomain);
            ldr.contentLoaderInfo.addEventListener(Event.COMPLETE, completeHandler);
            ldr.load(req, ldrContext);    
        }
        private function completeHandler(event:Event):void {
            ApplicationDomain.currentDomain.getDefinition("Greeter");
            var myGreeter:Greeter = Greeter(event.target.content);
            var message:String = myGreeter.welcome("Tommy");
            trace(message); // Hello, Tommy
        }
    }
}

当你使用 application domain 时需要记住的事情:

  • 在一个 SWF 文件内所有的程序存在一个 application domain。current domain 是你主要程序运行位置。system domain 包含所有的 application domain,包含 current domain,这意味它包含所有的 Flash Player 类别。
  • 所有的 application domain,除了 system domain,都有一个关联的 parent domain。你的主要程序的 application domain 的 parent domain 便是 system domain。已读取完的类别只有在父程序没有该定义时才可以被定义,你不能用一个新的定义覆写一个已读取的类别定义。

以下的图片表示一个应用程序从几个不同的 SWF 文件读取到一个单独的 domain, domain1.com。依据读取的内容,使用不同的 application domain。

主应用程序是 application1.swf,包含 Loader 对象,从其它 SWF 文件读取内容。current domain 是 Application domain 1。使用方式 A、B、C 表示不同的技巧用来对每个 SWF 文件设置适当的 aplication domain。

使用方式 A:藉由创建一个 system domain 的子域分隔子 SWF 文件。

在此图,application domain 2 是由 system domain 创建的子域。 application2.swf 被读取进入 application domain 2,并且它的类别定义因此与 application1.swf 的类别分隔开来。

这技巧的使用方式之一便是一个旧的应用程序动态读取一个新的相同应用程序而不会发生冲突。虽然类别名称相同但是不会冲突,因为它们被不同的 application domain 分隔。

以下的程序创建一个 system domain 的子 application domain:

request.url = "application2.swf";
request.applicationDomain = new ApplicationDomain();

使用方式 B :添加新的类别定义到当前的类别定义中。

module1.swf 的 application domain 被设置为 current domain (application domain 1) ,这让你在当前的应用程序的类别定义中添加一个新的类别定义,可以用于主程序的运行期共享库,被读取的 SWF 被当作一个远程共享库 (RSL)。使用此技巧可以在应用程序开始前用 preloader 读取 RSLs。

以下的程序设置一个 application domain 到 current domain:

request.url = "module1.swf";
request.applicationDomain = ApplicationDomain.currentDomain;

使用方式 C : 藉由创建一个 current domain 的子域使用父类别的定义。

module3.swf 的 application domain 是 current domain 的子域,而子程序使用父程序的版本。这种技巧的使用方式之一可以是成为多重视窗 RIA 的模块,被读取作为主程序的子程序,而子程序使用主程序的型别。假如你可以确认所有的类别更新总是向下兼容,并且读取程序总是比被读取的新,子程序将会使用父程序的版本。假如后续没有任何的参考指向子 SWF,拥有一个新的 application domain 也可以让你移除所有的类别定义,是为垃圾收集。

以下的程序创建一个 current domain 的子 application domain:

request.url = "module3.swf";
request.applicationDomain = new ApplicationDomain(ApplicationDomain.currentDomain);

PS. 实际上 AS3 URLRequest 并没有 applicationDomain 属性
真正用来指定 ApplicationDomain 还是需要透过 LoaderContext
文档上的应该只是 Pseudo Code~

相关参考资料:
Roger Gonzalez - ApplicationDomain
Roger Gonzalez - Modular Applications (part 1)
Roger Gonzalez - Modular Applications (part 2)
Roger Gonzalez - Multi-SWF Applications
Claus Wahlers - w3blog - AS3 Loading Class Libraries at Runtime
Jesse Warden dot Kizz-om - Modular ActionScript Development
WDDJ - Working with Large Applications

Read more...