Classbox/R

久しぶりにClassboxについて少しだけ考えた。
かなり前の書き込みで、最終的に実行される時点でのClassboxがどのように決定されるのかについて以下のように推測した。

  1. インスタンスオブジェクトについては、そのインスタンスの生成が記述されたコード上の位置のclassbox
  2. クラスオブジェクトについては、classbox階層の中でそのクラスが最終的に拡張/定義されたclassbox

若しメソッドの追加/変更だけでなく、フィールドの追加/変更もClassboxで可能とするのなら、インスタンスオブジェクトが属するClassboxは実行中不変でなければならないので、上記の仕様は自然であることに気付いた。尤も、Classboxの論文にはフィールドの追加、変更に関しては何も書かれていないように見えたが。
しかし上記の仕様だと、複雑なインスタンス生成を行うプログラムに対して、その一部のインスタンスだけを拡張Classboxのインスタンスに変更したい場合に、インスタンス生成コードをコピーしたもので再定義する必要が生じる。

classbox Base
  class X; end
  class Y; end
  class Z; end

  class Factory
    def self.createCompound()
      ... create compound of X, Y and Z ...
    end
  end
end

classbox Foo < Base
  class Y; ... ; end

  class Factory
    # Y is created as Foo classbox instance.
    def self.createCompound()
      ... same code of createCompound in Base classbox ...
    end
end

これを避けるためには、指定した範囲内のコードで生成されるインスタンスの属するclassboxを強制できる機能が必要かもしれない。

classbox Foo < Base
  class Y; ... ; end
  class Z; ... ; end

  class Factory
    def self.createCompound()
      use Y, Z { # Y, ZインスタンスはFooとして生成する
        original()
      }
    end
  end
end