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

Class Method Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#observer_peersHash|nil (readonly, protected)

Returns:

  • (Hash|nil)


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

Parameters:

  • event (Symbol|String)
  • args (Array<Object>)

Returns:

  • (self)


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

#initializeObject



98
99
100
# File 'lib/kamaze/project/concern/observable.rb', line 98

def initialize
  observer_peers_initialize
end

#observer_peers_initializeself (protected)

Initialize observers (defined from self.class.observer_peers)

Returns:

  • (self)


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