1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75
|
# frozen_string_literal: true
module Pluggaloid
module Mirage
MIRAGE_ID_BASE_NUMBER = 36
module Extend
# `Pluggaloid::Mirage` をincludeしたClassのうち、`pluggaloid_mirage_identity`
# メソッドを呼ばれたインスタンスを記録するオブジェクトを返す。
# 戻り値は、以下のメソッドに応答すること。
# - `repository#[](String id)` idに対応するオブジェクトを返す
# - `repository#[]=(String id, self obj)` objを記録する
# Class毎に適したコンテナを返すようにoverrideすること
def pluggaloid_mirage_repository
@pluggaloid_mirage_repository ||= {}
end
# `Pluggaloid::Mirage` をincludeしたClassのnamespaceを返す。
# namespaceはStringで、 `Pluggaloid::Mirage` をincludeしたほかのClassと
# 重複しない。
# 同じClassであれば、別のPluggaloid host(Pluggaloid::VMやプロセス)でも
# 同じ値を返す。
def pluggaloid_mirage_namespace
-to_s
end
def inherited(klass)
Mirage.pluggaloid_mirage_classes[klass.pluggaloid_mirage_namespace] = klass
end
end
def self.unwrap(namespace:, id:)
klass = pluggaloid_mirage_classes[namespace]
if klass
result = klass.pluggaloid_mirage_repository[id]
unless result&.is_a?(Pluggaloid::Mirage) # nilの場合は常にraise
raise ArgumentError, "The id `#{id}' was not found."
end
result
else
raise ArgumentError, "The namespace `#{namespace}' was not found."
end
end
def self.included(klass)
klass.extend(Extend)
pluggaloid_mirage_classes[klass.pluggaloid_mirage_namespace] = klass
end
def self.pluggaloid_mirage_classes
@pluggaloid_mirage_classes ||= {}
end
# このClassのなかで、Pluggaloid::Mirageがインスタンスを同定するためのid(String)を返す。
# このメソッドではなく、 `generate_pluggaloid_mirage_id` をoverrideすること
def pluggaloid_mirage_id
generate_pluggaloid_mirage_id.freeze.tap do |id|
self.class.pluggaloid_mirage_repository[id] = self
Mirage.pluggaloid_mirage_classes[self.class.pluggaloid_mirage_namespace] ||= self.class
end
end
def pluggaloid_mirage_namespace
self.class.pluggaloid_mirage_namespace
end
private
# このClassのなかで、Pluggaloid::Mirageがインスタンスを同定するためのid(String)を返す。
# Class毎に適したコンテナを返すようにoverrideすること
def generate_pluggaloid_mirage_id
object_id.to_s(MIRAGE_ID_BASE_NUMBER)
end
end
end
|