Sha256: 48f5df8309d40c216defd5fd3d1372c512ff2a1268444625af7af54f9f40e2f6

Contents?: true

Size: 1.62 KB

Versions: 3

Compression:

Stored size: 1.62 KB

Contents

module Kernel

  def instance_vars
    InstanceVariables.new(self)
  end

end


class InstanceVariables

  include Enumerable

  def initialize(delegate)
    @delegate = delegate
  end

  def instance_delegate
    @delegate
  end

  def each
    @delegate.instance_variables.each do |name|
      yield(name[1..-1].to_sym, @delegate.instance_variable_get(name))
    end
  end

  def to_hash
    h = {}
    each do |name, value|
      h[name] = value
    end
    h
  end

  def [](name)
    name = atize(name)
    @delegate.instance_variable_get(name)
  end

  def []=(name, value)
    name = atize(name)
    @delegate.instance_variable_set(name,value)
  end

  def <<(pair)
    name, value = *pair
    name = atize(name)
    @delegate.instance_variable_set(name, value)
  end

  # (See also: Kernel#populate, which uses accessor method rather than setting instance variables directly.)
  def update(hash)
    hash.each do |pair|
      self << pair
    end
  end

  def keys
    @delegate.instance_variables.collect do |name|
      name[1..-1].to_sym
    end
  end

  def names
    @delegate.instance_variables.collect do |name|
      name[1..-1]
    end
  end

  def values
    @delegate.instance_variables.collect do |name|
      @delegate.instance_variable_get(name)
    end
  end

  private

    def atize(name)
      name !~ /^@/ ? "@#{name}" : name
    end

end

=begin demo
  class Friend
    attr_accessor :name, :age, :phone
    def initialize(name, age, phone)
      @name, @age, @phone = name, age, phone
    end
  end

  f1 = Friend.new("John", 30, "555-1212")
  p f1.instance_vars
  f1.instance_vars.update({:name=>'Jerry'})
  p f1.instance_vars
=end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
facets-2.8.2 lib/core/facets/kernel/instance_variables.rb
facets-2.8.1 lib/core/facets/kernel/instance_variables.rb
facets-2.8.0 lib/core/facets/kernel/instance_variables.rb