Various calling things, overload, pattern matching, memoization and such.
Ruby
Switch branches/tags
Nothing to show
Latest commit 40bfdad Feb 16, 2012 @meh Bump version
Permalink
Failed to load latest commit information.
lib/call-me
test
README.md
Rakefile
call-me.gemspec

README.md

Various calling related functionalities

memoization (supports 1.8)

I wasn't completely happy with the actual memoization gems so I made one myself.

require 'call-me/memoize'

class Perl
  memoize
  def version
    `perl -MConfig -e 'print $Config{version};'`
  end
end

p = Perl.new
p.version # this will execute the method and cache the result
# subsequent calls will get the result from the cache

p.memoize_clear(:version) # this will clear the cache for version only
p.memoize_clear # this will clear the cache for every memoize method
# the caching is instance based, not class based, if you want class based
# caching just make a singleton :)

p.memoize_cache # this will return the cache (which is a simple Hash)

Memoizing already present classes from others code:

class Shortie::Service
  class << self
    memoize :find_by_key
  end

  memoize :shorten
end

named parameters (supports 1.8)

Stupid and ugly named parameters.

Some examples:

require 'call-me/named'

class LOL
  named :a, :b, :c, :optional => 0 .. -1
  def lol (a=1, b=2, c=3)
    [a, b, c]
  end

  named :a, :b, :c, :optional => [:a => 1, :b => 2, :c => 3]
  def omg (a=1, b=2, c=3)
    [a, b, c]
  end

  named def wat (a, b)
    [a, b]
  end
end

l = LOL.new


l.lol                          # [1, 2, 3]
l.lol(3, 2)                    # [3, 2, 3]
l.lol(:a => true)              # [true, 2, 3]
l.lol(:a => true, :b => false) # [true, false, 3]
l.lol(:a => true, :c => false) # [true, nil, false]
l.omg(:a => true, :c => false) # [true, 2, false]
l.wat(1, 2)                    # [1, 2]
l.wat(:b => 2, :a => 1)        # [1, 2] on 1.9, exception on 1.8
l.wat(2 => 2, 1 => 1)          # [1, 2] on 1.8 too

Please note that the last call has nil in b, this is because there's no way to tell Ruby this parameter should be filled with the optional value, so if you want people to use it that way, make sure to use nil and set the default value on nil OR make the optionals explicit and give them a value

overloading

Stupid and ugly overloading.

Some examples:

require 'call-me/overload'

class LOL
  def_signature Integer
  def lol (a)
    a * 2
  end

  def_signature String
  def lol (str)
    str * 2
  end
end

l = LOL.new

l.lol 2     # 4
l.lol "lol" # "lollol"
l.lol       # exception: ArgumentError: the arguments don't match any signature

pattern matching

Some examples:

require 'call-me/pattern-matching'

class LOL
  def_pattern 0
  def factorial (n)
    1
  end

  def factorial (n)
    n * factorial(n - 1)
  end
end

LOL.new.factorial(2) # 24