diff --git a/lib/observer.rb b/lib/observer.rb
index 75832ca..4b88c6d 100644
--- a/lib/observer.rb
+++ b/lib/observer.rb
@@ -151,11 +151,10 @@ module Observable
# *arg is the value passed to #notify_observers by this
# Observable
def add_observer(observer, func=:update)
- @observer_peers = {} unless defined? @observer_peers
unless observer.respond_to? func
raise NoMethodError, "observer does not respond to `#{func}'"
end
- @observer_peers[observer] = func
+ observers[observer] = func
end
#
@@ -164,25 +163,21 @@ def add_observer(observer, func=:update)
#
# +observer+:: An observer of this Observable
def delete_observer(observer)
- @observer_peers.delete observer if defined? @observer_peers
+ observers.delete observer
end
#
# Remove all observers associated with this object.
#
def delete_observers
- @observer_peers.clear if defined? @observer_peers
+ observers.clear
end
#
# Return the number of observers associated with this object.
#
def count_observers
- if defined? @observer_peers
- @observer_peers.size
- else
- 0
- end
+ observers.size
end
#
@@ -192,7 +187,7 @@ def count_observers
# +state+:: Boolean indicating the changed state of this Observable.
#
def changed(state=true)
- @observer_state = state
+ @notification_pending = state
end
#
@@ -200,11 +195,7 @@ def changed(state=true)
# #notify_observers call.
#
def changed?
- if defined? @observer_state and @observer_state
- true
- else
- false
- end
+ !! @notification_pending
end
#
@@ -216,14 +207,20 @@ def changed?
#
# *arg:: Any arguments to pass to the observers.
def notify_observers(*arg)
- if defined? @observer_state and @observer_state
- if defined? @observer_peers
- @observer_peers.each do |k, v|
- k.__send__(v, *arg)
- end
- end
- @observer_state = false
+ return unless @notification_pending
+
+ observers.each do |peer_or_proc, trigger_method|
+ peer_or_proc.__send__(trigger_method, *arg)
end
+ @notification_pending = false
end
+ private
+
+ #
+ # Lazy-initialized @observers getter.
+ #
+ def observers
+ @observers ||= {}
+ end
end