kaspernj/wref

View on GitHub
lib/wref/implementations/id_class_unique.rb

Summary

Maintainability
A
1 hr
Test Coverage
class Wref::Implementations::IdClassUnique
  def initialize(object)
    @id = object.__id__
    @class_name = object.class.name.to_sym
    ObjectSpace.define_finalizer(object, method(:destroy))
    @unique_id = object.__wref_unique_id__ if object.respond_to?(:__wref_unique_id__)
  end

  def get!
    object = get
    raise ::Wref::Recycled unless object
    return object
  end

  def get
    return nil if !@class_name || !@id

    begin
      object = ObjectSpace._id2ref(@id)
    rescue RangeError
      destroy
      return nil
    end

    #Some times this class-name will be nil for some reason - knj
    object_class_name = object.class.name

    if !object_class_name || @class_name != object_class_name.to_sym || @id != object.__id__
      destroy
      return nil
    end

    if @unique_id
      destroy
      return nil if !object.respond_to?(:__wref_unique_id__) || object.__wref_unique_id__ != @unique_id
    end

    return object
  end

  def alive?
    if get
      return true
    else
      return false
    end
  end

private

  def destroy(*args)
    @id = nil
    @class_name = nil
    @unique_id = nil
  end
end