-
-
Save nilbus/6385142 to your computer and use it in GitHub Desktop.
Ruby multiple callbacks
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# alternative to what is explained in the article Ruby Blocks as Dynamic Callbacks: | |
# http://www.mattsears.com/articles/2011/11/27/ruby-blocks-as-dynamic-callbacks | |
class Callbacks | |
def initialize(block) | |
block.call(self) | |
end | |
def callback(message, *args) | |
callbacks[message].call(*args) | |
end | |
def method_missing(m, *args, &block) | |
block ? callbacks[m] = block : super | |
self | |
end | |
private | |
def callbacks | |
@callbacks ||= {} | |
end | |
end | |
class Twitter | |
def tweet(msg, &block) | |
callbacks = Callbacks.new(block) | |
publish(msg) | |
callbacks.callback(:success) | |
rescue => e | |
callbacks.callback(:failure, e.message) | |
end | |
end | |
t = Twitter.new | |
t.tweet('Hello there!') do |on| | |
on.success do | |
puts "Success!" | |
end | |
on.failure do |msg| | |
puts "Failure! Message: #{msg}" | |
end | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
For n00bs like myself who are trying to practice the dark art of Procs, the key component at play is the
#method_missing
piece. This will register the callback (on.success
,on.failure
) as a symbolized key in the@callbacks
hash, but only once.A similar solution would be to define methods
success
andfailure
on theTwitter
class. For those new to experimenting with Procs, this solution may work a little better as the code path is a little more transparent.Thanks for this tacit and well crafted example!