class IceNine::RecursionGuard::ObjectSet

Protects against infinite recursion by never yielding with the same object more than once.

Public Class Methods

new() click to toggle source

Initialize a recursion guard

@return [undefined]

# File lib/ice_nine/support/recursion_guard.rb, line 16
def initialize
  @object_ids = {}
end

Public Instance Methods

guard(object) { || ... } click to toggle source

Guard against recursively calling a block with the same object

@example

recursion_guard = IceNine::RecursionGuard::ObjectSet.new
recursion_guard.guard(object) do
  logic_which_may_be_recursively_called_with_object(recursion_guard)
end

@param [Object] object

@return [Object]

# File lib/ice_nine/support/recursion_guard.rb, line 31
def guard(object)
  caller_object_id = object.__id__
  return object if @object_ids.key?(caller_object_id)
  @object_ids[caller_object_id] = nil
  yield
end