Module: Kamaze::Project::Concern::Observable
- Included in:
- Observable
- Defined in:
- lib/kamaze/project/concern/observable.rb
Overview
Observable provides the methods for managing the associated observers.
The observers SHOULD implement a method called update
to receive notifications.
The observable object MNUST:
- call
#dispatch_event
Sample of use:
# @abstract
class Observable
include Kamaze::Project::Concern::Observable
end
class Subject < Observable
attr_accessor :updated_at
def update
# do something
dispatch_event(:after_update)
end
end
class SubjectObserver < Kamaze::Project::Observer
observe Subject
def after_update(subject)
subject.updated_at = Time.now
end
end
Defined Under Namespace
Modules: ClassMethods
Instance Attribute Summary collapse
- #observer_peers ⇒ Hash|nil readonly protected
Class Method Summary collapse
Instance Method Summary collapse
-
#dispatch_event(event, *args) ⇒ self
protected
Dispatch given
event
. - #initialize ⇒ Object
-
#observer_peers_initialize ⇒ self
protected
Initialize observers (defined from
self.class.observer_peers
).
Instance Attribute Details
#observer_peers ⇒ Hash|nil (readonly, protected)
105 106 107 |
# File 'lib/kamaze/project/concern/observable.rb', line 105 def observer_peers @observer_peers end |
Class Method Details
.included(base) ⇒ Object
47 48 49 |
# File 'lib/kamaze/project/concern/observable.rb', line 47 def included(base) base.extend(ClassMethods) end |
Instance Method Details
#dispatch_event(event, *args) ⇒ self (protected)
Dispatch given event
125 126 127 128 129 130 131 |
# File 'lib/kamaze/project/concern/observable.rb', line 125 def dispatch_event(event, *args) observer_peers.to_h.each do |k, v| k.__send__(v, *[event, self].concat(args)) end self end |
#initialize ⇒ Object
98 99 100 |
# File 'lib/kamaze/project/concern/observable.rb', line 98 def initialize observer_peers_initialize end |
#observer_peers_initialize ⇒ self (protected)
Initialize observers (defined from self.class.observer_peers
)
110 111 112 113 114 115 116 117 118 |
# File 'lib/kamaze/project/concern/observable.rb', line 110 def observer_peers_initialize (@observer_peers ||= {}).yield_self do |observer_peers| self.class.__send__(:observer_peers).to_h.each do |k, v| observer_peers[k.new] = v end end self end |