module Rbgo::Observable

Public Instance Methods

add_observer(observer, func = :update) click to toggle source
# File lib/rbgo/observer.rb, line 9
def add_observer(observer, func = :update)
  unless defined? @observer_peers
    Observable.instance_variable_get(:@mutex).synchronize do
      @observer_peers = SyncHash.new unless defined? @observer_peers
    end
  end

  unless observer.respond_to? func
    raise NoMethodError, "observer does not respond to `#{func}'"
  end
  @observer_peers[observer] = func
end
changed(state = true) click to toggle source
# File lib/rbgo/observer.rb, line 38
def changed(state = true)
  Observable.instance_variable_get(:@mutex).synchronize do
    @observer_state = state
  end
end
changed?() click to toggle source
# File lib/rbgo/observer.rb, line 44
def changed?
  if defined? @observer_state and @observer_state
    true
  else
    false
  end
end
count_observers() click to toggle source
# File lib/rbgo/observer.rb, line 30
def count_observers
  if defined? @observer_peers
    @observer_peers.size
  else
    0
  end
end
delete_observer(observer) click to toggle source
# File lib/rbgo/observer.rb, line 22
def delete_observer(observer)
  @observer_peers.delete observer if defined? @observer_peers
end
delete_observers() click to toggle source
# File lib/rbgo/observer.rb, line 26
def delete_observers
  @observer_peers.clear if defined? @observer_peers
end
notify_observers(*arg) click to toggle source
# File lib/rbgo/observer.rb, line 52
def notify_observers(*arg)
  if defined? @observer_state and @observer_state
    if defined? @observer_peers
      Observable.instance_variable_get(:@mutex).synchronize do
        if @observer_state
          @observer_peers.each do |k, v|
            CoRun::Routine.new(new_thread: false, queue_tag: :default) do
              k.send v, *arg
            end
          end
          @observer_state = false
        end
      end
    end
  end
end