metatable とは
  userdata, table への演算に対してどの関数を呼び出すのかを
  連想配列で表した表( テーブル )のこと。
  データ型はテーブルと同じで、userdata, table と関連づけるだけの違い。
  
■ MetaMethod とは演算子を独自処理におきかえる
  POINT
    [ 演算子 ]を独自処理におきかえる.( operator のこと )
    MetaMethod を利用することで実現している.
      tbl の値取得, 関数呼び出しの値を変更することも可能.
      OO では [ 演算子を独自に定義できる ]ことが特徴.
   {"pos" , getPos() } < -> tbl 経由で呼び出す. ?
  { data, Evt=Func } の組を MetaTbl として にセットすることで Lua に通知する。
  
■ event の種類
-- MetaMethod
   local data1 = { name="a", price=120}
   local data2 = { name="b", price=100}
   function add( op1, op2 )
      return op1.price + op2.price;
   end
   -- data1 の加算 + には myAdd を利用するように登録
   setmetatable( data1, { __add = add, ... } )
   print( data1 + data2 );
■ Overload
  POINT
   metatable はある値( Object )に対して, 特別な演算を overload する際に便利。
   スレッド、関数、ユーザーデータ型のオブジェクトはメタテーブルをもつ。
   { KEY == Event , 値 = MetaMethod }
  使いどころ
  その値に対して特殊な処理をした際の, 挙動を定義する
  
    数値以外の値が加算のオペランドになった ---> Luaはメタテーブルの "__add" フィールドをチェック
    加算を行うためにその関数をcall
  Object のふるまいを定義する
  metatable は、算術演算、関係比較、連結、長さ演算子、インデックス付けについて
  オブジェクトがどう振る舞うかを制御する
  メタテーブルがコントロールできる演算を以下のとおり
  各演算のキーは、その名前の前に2つのアンダースコア `__´ が付く文字列
  __add,            a + b の時にコールされる
  __sub, 
  __mul, 
  __div, 
  __mod,
  __concat, 
  __len
  __tostring       print( a ); 
  setmetatable( metatableをセットする値, {metatable}), 
  metatable = {_add, 関数名 }
■ 環境table
  環境は table のひとつ.
  thread に関連つけられた環境は, global環境と呼ぶ.