Flex にはメタタグというものがある。Flex 3 - メタデータタグ に一覧がある。正確にはメタタグじゃなくてメタデータタグというのかね? でもまぁメタタグって言い方のほうが良く見かける気がするのでまぁいいや。
でもって Mixin というメタタグはここの一覧に無い。で、ちょっと調べてみた感じでは The Flex Non-Docs - metadeta で書かれてるように、公式ドキュメントあったりなかったりしてるようだ。2007/4 月の記事なんで今はどうなのかわからんけど。
それはさておき。Mixin とかいうメタタグの使い方ですが。
<?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" xmlns:local="*"> <local:MixinTest/> </mx:Application>
package { import mx.managers.SystemManager; [Mixin] public class MixinTest { public static function init( sm:SystemManager ):void { trace("MixinTtest_init"); } } }
こうしとくと Flex アプリの起動時に init メソッドが勝手に呼ばれてくれる。クラスに Mixin というメタタグを付けて、init って名前のメソッドを定義しとくだけ。Flex アプリの起動時に何かしら初期化処理したいときに使うもののようだ。
ちなみに引数の型は SystemManager と互換性あれば何でもいいらしい。とりあえず下記のような書き方でも問題無く動いた。
public static function init( sm:Object ):void {} public static function init( sm:DisplayObject ):void {} public static function init( sm:IFlexModuleFactory ):void {}
折角なのでちょっと SystemManager のソース見てみたら、こんな感じになってた。
mx_internal function docFrameHandler(event:Event = null):void { ... var mixinList:Array = info()["mixins"]; if (mixinList && mixinList.length > 0) { var n:int = mixinList.length; for (var i:int = 0; i < n; ++i) { // trace("initializing mixin " + mixinList[i]); var c:Class = Class(getDefinitionByName(mixinList[i])); c["init"](this); } } ... }
c["init"](this) で呼んでるからなのね。試しに、Mixin のメタタグはあるけど init 関数定義しないでみたら、当然実行時エラー。文字列で関数が呼べる、という感覚に相変わらず慣れない俺であった……
ところでさっきから Flex アプリの起動時、って何気なく書いてるけど、Flex というか swf のライフサイクルは結構ややこしいことを最近知った。Mixin 関連のこと調べて知ったのは、元々 swf は Flash 由来の技術なわけなので、ライフサイクルに置いてはフレームってやつが鍵になってるようだ。
このフレームってヤツはフツーのプログラマにはあんま馴染みの無い代物だと思う。いわゆる、オーサリングツール……っていうの? Adobe Flash CS とか Microsoft Expression Blend みたいなのを見たことあればわかるんだけど。アレのタイムラインとかいう鍵盤みたいなのの一マスがフレームと呼ばれるもののようだ。
Flash CS3 などでアニメーションを作成する場合、タイムライン上にフレームを並べていきますが、Flex アプリケーションは、通常2フレームの SWF ファイルとして定義されています。
とか書かれてる。SystemManager の動作が解説されてるけど、ややこしくて全部は読めてない……とりあえず、Flex のイベント処理とかその辺詳しく知るにはこういう知識が必要になるようですね。