NAME

methodhash

SYNOPSIS

A Hash subclass for automatic storage of values obtained from a method 
defined by the user. Useful for lengthy calculations on large datasets.

URI

http://rubyforge.org/projects/methodhash
http://github.com/fredrikj/methodhash

INSTALL

gem install methodhash

DESCRIPTION

A Hash subclass that defines its values from a specified method.
Use it by creating a subclass of MethodHash, and define a method
with the name "mymethod" in it. Like this (same code in samples/samples.rb):

# 1. Simple use
class AddOne < MethodHash
  def mymethod(a)
    sleep 3
    a + 1
  end
end 

a = AddOne.new
a            #  {}
a[1]         #  2
a[7]         #  8
a            #  {1=>2, 7=>8}
puts a.dump  #  --- !map:AddOne 
             #  1: 2
             #  7: 8

# 2. With a file
b = AddOne.new '/tmp/one.yml'
b            #  {}
b[1]         #  2
b.dump       #  '/tmp/one.yml' 
c = AddOne.new '/tmp/one.yml'
puts c.inspect #  {1=>2}

# 3. Some protection against data corruption.
class AddTwo < MethodHash
  def mymethod(a)
    a + 2
  end
end 

begin
  d = AddTwo.new '/tmp/one.yml' #  ArgumentError: Path holds class AddOne
rescue
  puts $!
end

# 4. Saving exceptions arising from mymethod.
class AddOneFaulty < MethodHash
  def mymethod(a)
    rand(2)==0 ? raise("Epic Fail!") : a+1
  end
end 

e = AddOneFaulty.new
e[1]                 #  RuntimeError: Epic Fail!  # If something bad happened
e                    #  {1=>"ERROR: Epic Fail!"}
e.retry_errors       #  false
e[1]                 #  RuntimeError: Epic Fail!  # Still keeping the error
e.retry_errors=true  #  true
e[1]                 #  2                         # If better luck this time
e                    #  {1=>2}

# 5. A more complex setting
class AddThree < MethodHash
  def initialize(path1=nil, path2=nil, mypath=nil)
    @one = AddOne.new(path1)
    @two = AddTwo.new(path2)
    super(mypath)
  end

  def mymethod(a)
    @one[a] + @two[a] - a
  end

  def dump
    @one.dump
    @two.dump
    super
  end
end

f = AddThree.new( '/tmp/one.yml', '/tmp/two.yml')
puts f[3]
f.dump

# 6. With two arguments
class Add < MethodHash
  def mymethod(a,b)
    a + b
  end
end

HISTORY

0.5.0

  Initial version