erlang の OO もどきの仕様(これっていつから?)

下記のコードのように、-module の二つ目の引数にリストを渡すと・・・

-module(new_test, [Test1, Test2, Test3]).
-author('cooldaemon@gmail.com').

-export([get/1]).

get(test1) -> Test1;
get(test2) -> Test2;
get(test3) -> Test3.

new/3 が定義され、get/1 の引数が一つ増えて、get/2 となる。

$ erl
1> new_test:module_info().
[{exports,[{new,3},{get,2},{module_info,0},{module_info,1}]},
 {imports,[]},
 {attributes,[{vsn,[82552267300809369358202831582896571762]},
              {abstract,true},
              {author,['cooldaemon@gmail.com']}]},
 {compile,[{options,[]},
           {version,"4.5"},
           {time,{2008,5,2,7,56,34}},
           {source,"/Users/cooldaemon/tmp/erl/new_test.erl"}]}]

これは、下記のように使える。

2> NewTestObj1 = new_test:new(foo, bar, baz).
{new_test,foo,bar,baz}
3> NewTestObj1:get(test1).
foo
4> NewTestObj1:get(test2).
bar
5> NewTestObj2 = new_test:new(qux, quux, corge).
{new_test,qux,quux,corge}
6> NewTestObj2:get(test3).
corge

さらに、こんな事もできる。

7> {new_test, grault, garply, waldo}:get(test1).
grault
8> new_test:get(test1, {new_test, fred, plugh, xyzzy}).
fred

上記、mochiweb_request.erl を眺めていて知ったんですが、リファレンスマニュアルに載ってないですよね?
こう言う情報は、どこから仕入れるのが一番早いのだろうか・・・?

追記 (変数 THIS が使えた)

-module(new_test, [Test1, Test2, Test3]).
-author('cooldaemon@gmail.com').

-export([get/1]).

get(this)  -> THIS;
get(test)  -> lists:map(fun (X) -> THIS:get(X) end, [test1, test2, test3]).
get(test1) -> Test1;
get(test2) -> Test2;
get(test3) -> Test3.
1> NewTestObj = new_test:new(foo, bar, baz).
{new_test,foo,bar,baz}
2> NewTestObj:get(this).
{new_test,foo,bar,baz}
3> NewTestObj:get(test).
[foo,bar,baz]

追記 (dict モジュールで使用されていた)

1> Dict1 = dict:new().
2> Dict2 = Dict1:store(key1, value1).
3> Dict2:find(key1).

gb_trees も、ほとんどの関数において末尾の引数が gb_tree() 型だから OO っぽい事ができるかと思ったら、gb_tree() 型 は、モジュール名を保持していなかった。残念。