class Module

Public Instance Methods

weak_attr(*attrs) click to toggle source
# File lib/motion/motion-weakattr.rb, line 2
def weak_attr(*attrs)
  attrs.each do |attr_name|
    attr_accessor attr_name

    normal_getter = "#{attr_name}"
    normal_setter = "#{attr_name}="
    with_getter = "#{attr_name}_with_weakref"
    without_getter = "#{attr_name}_without_weakref"
    with_setter = "#{attr_name}_with_weakref="
    without_setter = "#{attr_name}_without_weakref="

    define_method(with_setter) do |value|
      self.send(without_setter, WeakRef.new(value))
    end

    define_method(with_getter) do
      value = self.send(without_getter)
      if value.respond_to?(:weakref_alive?)
        return value if value.weakref_alive?
        nil
      else
        value
      end
    end

    alias_method without_getter, normal_getter
    alias_method normal_getter, with_getter

    alias_method without_setter, normal_setter
    alias_method normal_setter, with_setter
  end
end