Skip to content

Instantly share code, notes, and snippets.

@avit
Created February 21, 2012 06:48
Show Gist options
  • Save avit/1874478 to your computer and use it in GitHub Desktop.
Save avit/1874478 to your computer and use it in GitHub Desktop.
Playing with duck-typed callables
module Import
module Translation
@translators = {}
def self.register(name, callable)
if callable.respond_to?(:call)
@translators[name.to_sym] = callable
else
raise Exception("Registered translators must be callable")
end
end
def self.translate(translator, value)
@translators[translator].call(value)
end
end
end
module Import::Translation
class Reverse
def self.call(value)
value.reverse
end
end
end
class SomeClass
def helper(value)
value.reverse
end
end
tr1 = Import::Translation::Reverse
Import::Translation.register(:tr1, tr1)
puts Import::Translation.translate(:tr1, "evian")
tr2 = SomeClass.new.public_method(:helper)
Import::Translation.register(:tr2, tr2)
puts Import::Translation.translate(:tr2, "koala")
tr3 = ->(value){ value.reverse }
Import::Translation.register(:tr3, tr3)
puts Import::Translation.translate(:tr3, "mongo")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment