mx.modules.moduleBase

Roger Gonzalez: My MAX preso...の資料に入ってるサンプルをさらに簡単にした例。

-app
  -MyApp.as
-interface
  -IMyAppMessage.as
-modules
  -module01
    -MyModule01.as

というフォルダ構成にして、アプリとモジュールがインタフェースさえ知っていればコンパイル・インタフェース呼び出し可能であることを確認する。
とりあえずモジュールを呼ぶほうのアプリを、モジュールを呼ばずにコンパイル

package {
    import flash.display.Sprite;
    import flash.text.*;
    import flash.events.Event;
    import mx.events.ModuleEvent;
    import mx.modules.ModuleManager;
    import mx.modules.IModuleInfo;

    public class MyApp extends Sprite {
        private var textField:TextField;
        private var applicationMsg:String;

        public function MyApp() {
            applicationMsg = "My first modulable Application.";
            textField = new TextField();
            textField.width = 300;
            textField.text = "foo";
            addChild(textField);

            // ...
//            loadModule("../modules/module01/MyModule01.swf");
        }
        public function render(msg:String):void {
            textField.text = msg;
        }
        public function loadModule(moduleUrl:String):void {
            var module:IModuleInfo = ModuleManager.getModule(moduleUrl);
            module.addEventListener(ModuleEvent.READY, function(e:ModuleEvent):void {
                var myappMsg:IMyAppMessage = module.factory.create() as IMyAppMessage;
                myappMsg.initialize(applicationMsg);
                render(myappMsg.getMessage());
            });
            module.load();
        }
    }
}

loadModule実行してないけど関数定義でIMyAppMessageインタフェースを参照してるのでIMyAppMessageにパスを通してコンパイルする。

koyachi@colinux:~/code/as/moduleBase_sample$ mxmlc -source-path=./interface/ ./app/MyApp.as

IMyAppMessage.asは以下のとおり。

package {
    public interface IMyAppMessage {
        function initialize(appMessage:String):void;
        function getMessage():String;
    }
}

MyApp.swfを実行し、"foo"と表示されていることを確認。

次に呼ばれるほうのモジュールのコンパイル

package {
    import mx.modules.ModuleBase;

    public class MyModule01  extends ModuleBase implements IMyAppMessage {
        private var applicationMsg:String;
        private var moduleMsg:String;

        public function MyModule01(){
            moduleMsg = "This is Module01.";
        }
        public function initialize(appMessage:String):void {
            applicationMsg = appMessage;
        }
        public function getMessage():String {
            return applicationMsg + "and, " + moduleMsg;
        }
    }
}
koyachi@colinux:~/code/as/moduleBase_sample$ mxmlc -source-path=./interface/ ./modules/module01/MyModule01.as

モジュールコンパイルできたらアプリのほうのloadModule()呼び出しのコメント外して再コンパイルし、MyApp.swfを実行して"My first modulable Application.and, This is Module01."が表示されることを確認。
インタフェース参照のためのコンパイルオプションはasと同じフォルダに*-config.xml(MyApp-config.xml等)を置くとよい。

<flex-config>
  <compiler>
    <source-path>
      <path-element>./interface/</path-element>
    </source-path>
  </compiler>
</flex-config>

RSL(Runtime Shared Library)だと動的リンクする場合でも外部モジュールのコンパイル結果(swf,swc)が必要だけどmx.moduleだとインタフェースがわかっているのでいらない。逆にあらかじめ決めたインタフェースでしかモジュールと通信できないのでgetClass()とかはできなくなる、ということらしいです。