module Kamaze::Project::Concern::Observable

Observable provides the methods for managing the associated observers.

The observers SHOULD implement a method called “update“ to receive notifications.

The observable object MNUST:

Sample of use:

“`ruby # @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 “`

Attributes

observer_peers[R]

@return [Hash|nil]

Public Class Methods

included(base) click to toggle source
# File lib/kamaze/project/concern/observable.rb, line 47
def included(base)
  base.extend(ClassMethods)
end
new() click to toggle source
# File lib/kamaze/project/concern/observable.rb, line 98
def initialize
  observer_peers_initialize
end

Protected Instance Methods

dispatch_event(event, *args) click to toggle source

Dispatch given “event“

@param [Symbol|String] event @param [Array<Object>] args

@return [self]

# File lib/kamaze/project/concern/observable.rb, line 126
def dispatch_event(event, *args)
  self.tap do
    observer_peers.to_h.each do |k, v|
      k.__send__(v, *[event, self].concat(args))
    end
  end
end
observer_peers_initialize() click to toggle source

Initialize observers (defined from “self.class.observer_peers“)

@return [self]

# 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