Skip to content

Instantly share code, notes, and snippets.

@asterite
Created February 5, 2015 21:10
Show Gist options
  • Save asterite/7e69916a3e19f3084d6a to your computer and use it in GitHub Desktop.
Save asterite/7e69916a3e19f3084d6a to your computer and use it in GitHub Desktop.
macro def_observer_pattern(name)
{% up = name.id %}
{% down = name.stringify.downcase.id %}
module {{up}}Observer
abstract def on_{{down}}(obj)
end
module {{up}}Observable
def add_{{down}}_observer(observer : {{up}}Observer)
observers = @{{down}}_observers ||= [] of {{up}}Observer
observers << observer
end
def notify_on_{{down}}(obj)
@{{down}}_observers.try &.each &.on_{{down}}(obj)
end
end
end
def_observer_pattern Num
def_observer_pattern String
class Foo
include NumObservable
include StringObservable
end
class Bar
include NumObserver
include StringObserver
def on_num(num)
puts "#{self} (Num): #{num}"
end
def on_string(str)
puts "#{self} (String): #{str}"
end
end
foo = Foo.new
foo.add_num_observer(Bar.new)
foo.add_num_observer(Bar.new)
foo.add_string_observer(Bar.new)
foo.notify_on_num 1
foo.notify_on_string "Hello!"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment