Sha256: 0e944ce8eec15bdbe90cc97220fa0dcbd6e471fdaed4fcce593f737bee104455

Contents?: true

Size: 1.26 KB

Versions: 19

Compression:

Stored size: 1.26 KB

Contents

# o = Observable.new
# o.append('greet') {
#  puts 'hi'
# }
# o.call('greet')
#
# def greet(who)
#  puts "Hi #{who}"
# end
# event = o.append('greet', method(:greet), 'Alex')
# o.call('greet')
# event.remove

module Bowline
  class Observable
    class Event
      attr_reader :type, :callback
      def initialize(observable, type, callback = nil)
        @observable = observable
        @type       = type
        @callback   = callback
      end
      
      def call(*args)
        @callback.call(*args)
      end
      
      def remove
        @observable.remove(self)
      end
    end
    
    def initialize
      @listeners = {}
    end

    def append(event, method = nil, &block)
      event = Event.new(self, event, method||block)
      (@listeners[event] ||= []) << event
      event
    end

    def call(event, *args)
      return unless @listeners[event]
      @listeners[event].each do |callback|
        callback.call(*args)
      end
    end
    
    def remove(event, value=nil)
      return unless @listeners[event]
      if value
        @listeners[event].delete(value)
        if @listeners[event].empty?
          @listeners.delete(event)
        end
      else
        @listeners.delete(event)
      end
    end

    def clear
      @listeners = {}
    end
  end
end

Version data entries

19 entries across 19 versions & 2 rubygems

Version Path
maccman-bowline-0.1.10 lib/bowline/observer.rb
maccman-bowline-0.1.8 lib/bowline/observer.rb
maccman-bowline-0.3.0 lib/bowline/observer.rb
maccman-bowline-0.3.1 lib/bowline/observer.rb
maccman-bowline-0.3.3 lib/bowline/observer.rb
maccman-bowline-0.3.5 lib/bowline/observer.rb
maccman-bowline-0.3.6 lib/bowline/observer.rb
maccman-bowline-0.3.7 lib/bowline/observer.rb
maccman-bowline-0.3.9 lib/bowline/observer.rb
maccman-bowline-0.4.0 lib/bowline/observer.rb
maccman-bowline-0.4.1 lib/bowline/observer.rb
maccman-bowline-0.4.3 lib/bowline/observer.rb
maccman-bowline-0.4.4 lib/bowline/observer.rb
maccman-bowline-0.4.5 lib/bowline/observer.rb
maccman-bowline-0.4.6 lib/bowline/observer.rb
maccman-bowline-0.4.7 lib/bowline/observer.rb
maccman-bowline-0.4.8 lib/bowline/observer.rb
bowline-0.4.6 lib/bowline/observer.rb
bowline-0.3.9 lib/bowline/observer.rb