2012-06-12 03:44:50 -05:00
|
|
|
module V8
|
|
|
|
module Util
|
|
|
|
module Weakcell
|
|
|
|
def weakcell(name, &block)
|
|
|
|
unless storage = instance_variable_get("@#{name}")
|
|
|
|
storage = instance_variable_set("@#{name}", Storage.new)
|
|
|
|
end
|
|
|
|
storage.access(&block)
|
|
|
|
end
|
|
|
|
class Storage
|
|
|
|
def access(&block)
|
|
|
|
if @ref
|
2012-06-20 04:35:40 -05:00
|
|
|
@ref.object || populate(block)
|
2012-06-12 03:44:50 -05:00
|
|
|
else
|
|
|
|
populate(block)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
private
|
|
|
|
|
|
|
|
def populate(block)
|
|
|
|
occupant = block.call()
|
2012-06-20 04:35:40 -05:00
|
|
|
@ref = Ref::WeakReference.new(occupant)
|
2012-06-12 03:44:50 -05:00
|
|
|
return occupant
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|