1 # frozen_string_literal: true
4 # Weak Reference class that allows a referenced object to be
7 # A WeakRef may be used exactly like the object it references.
11 # foo = Object.new # create a new object instance
12 # p foo.to_s # original's class
13 # foo = WeakRef.new(foo) # reassign foo with WeakRef instance
14 # p foo.to_s # should be same class
15 # GC.start # start the garbage collector
16 # p foo.to_s # should raise exception (recycled)
19 class WeakRef < Delegator
23 # RefError is raised when a referenced object has been recycled by the
26 class RefError < StandardError
29 @@__map = ::ObjectSpace::WeakMap.new
32 # Creates a weak reference to +orig+
37 @delegate_sd_obj = orig
44 def __getobj__ # :nodoc:
45 @@__map[self] or defined?(@delegate_sd_obj) ? @delegate_sd_obj :
46 Kernel::raise(RefError, "Invalid Reference - probably recycled", Kernel::caller(2))
49 def __setobj__(obj) # :nodoc:
53 # Returns true if the referenced object is still alive.
56 @@__map.key?(self) or defined?(@delegate_sd_obj)