functionの引数

functionの引数が取れない。調査中にFlexBuilderが壊れてコンパイルできなくなったので今修復中。
>eclipse3.3にFlexBuilder3入れて復旧。
で、試したのは次のコード。

//テスト用クラス
package{
   public class FunctionTest{
      public var value:int;
      public function test(arg:String,arg2:String="default"):void{
        trace(arg + value + arg2);
      }
   }
}
//実行
public function main():void {
  var functionTest:FunctionTest = new FunctionTest();
  functionTest.value = 100;
  
  trace("----インスタンス");
  trace(describeType(functionTest));
  trace("----Function");
  trace(describeType(functionTest.test));
  
  var f:Function = functionTest.test;
  trace("----Function呼び出し");
  f("value=");
}

で、結果

----インスタンス
<type name="FunctionTest" base="Object" isDynamic="false" isFinal="false" isStatic="false">
  <extendsClass type="Object"/>
  <variable name="value" type="int"/>
  <method name="test" declaredBy="FunctionTest" returnType="void">
    <parameter index="1" type="String" optional="false"/>
    <parameter index="2" type="String" optional="true"/>
  </method>
</type>
----Function
<type name="builtin.as$0::MethodClosure" base="Function" isDynamic="false" isFinal="true" isStatic="false">
  <extendsClass type="Function"/>
  <extendsClass type="Object"/>
  <accessor name="prototype" access="readwrite" type="*" declaredBy="builtin.as$0::MethodClosure"/>
  <accessor name="length" access="readonly" type="int" declaredBy="builtin.as$0::MethodClosure"/>
</type>
----Function呼び出し
value=100default

これで何が分かるかというと

1.インスタンスをdescribeTypeで調べると、Functionの引数が分かるかどうか
2.Function自体を調べると、Functionの引数が分かるかどうか
3.Function呼び出しがthisポインターを持っているかどうか

ということ。
1に関しては、メソッドの名前、引数(型とデフォルト値があるかどうか)、戻り値などがわかる。
2は期待はずれで、describeTypeがFunctionであるということしか分からない。
3はインスタンスにセットした「100」がちゃんと出力されており、thisポインターが入っていることが分かる。

で、何のためにこれを調べたかというと、

public function execute(f:Function):void{
 if( fの第一引数がFunction ){
     f(nextExecute);
  }else{
     f();
  }
}
public function nextExecute():void{
}

というコードが書きたかったからだ。
AS3から引数に対するチェックが厳しくなり、Functionの宣言と異なる引数を渡すとエラーになるため、
先にチェックして調整してからFunctionを呼び出したかったのだが、どうもこの様子だと難しいようだ。
インスタンスにFunctionが引っ付いていれば行けるかなと思い、次のようなコードを書いてみたが

public function main(){
  var f:Function = functionTest.test;
  trace(describeType(f["this"]));
  //無理やりつける
  var o:Object = new Object();
  o.test = f;
  trace(describeType(o));
}

結果

ReferenceError: Error #1069: builtin.as$0.MethodClosure にプロパティ this が見つからず、デフォルト値もありません。

<type name="Object" isDynamic="true" isFinal="false" isStatic="false">
  <method name="hasOwnProperty" declaredBy="Object" returnType="Boolean" uri="http://adobe.com/AS3/2006/builtin">
    <parameter index="1" type="*" optional="true"/>
  </method>
  <method name="isPrototypeOf" declaredBy="Object" returnType="Boolean" uri="http://adobe.com/AS3/2006/builtin">
    <parameter index="1" type="*" optional="true"/>
  </method>
  <method name="propertyIsEnumerable" declaredBy="Object" returnType="Boolean" uri="http://adobe.com/AS3/2006/builtin">
    <parameter index="1" type="*" optional="true"/>
  </method>
</type>

"this"という変数はなく、エラーになった。Objectの方は、動的につけたメソッドは出てこないようだ。
Function内部にthisに相当するポインタがあることは確実だが、どこを調べてもそれの取り出し方が分からない。
(ためしにfor(var key in f)でもまわしてみたが、プロパティは取れなかった)

さて、どうするか。。。