Sha256: da2c3ad49817d0ad8e6b19c0a38bd6a1577463551389ef7ad9096e4a6c77ed39

Contents?: true

Size: 1.19 KB

Versions: 1

Compression:

Stored size: 1.19 KB

Contents

module CyberarmEngine
  module Event # Gets included into Element
    def subscribe(event, method = nil, &block)
      handler = method || block
      @event_handler[event] << handler

      Subscription.new(self, event, handler)
    end

    def unsubscribe(subscription)
    end

    def publish(event, *args)
      raise ArgumentError, "#{self.class} does not handle #{event.inspect}" unless @event_handler.include?(event)

      return unless enabled?

      was_handled = false

      was_handled = true if respond_to?(event) && (send(event, self, *args) == :handled)

      @event_handler[event].reverse_each do |handler|
        if handler.call(self, *args) == :handled
          was_handled = true
          break
        end
      end

      return :handled if was_handled

      parent.publish(event, *args) if parent
      nil
    end

    def event(event)
      @event_handler ||= {}
      @event_handler[event] ||= []
    end
  end

  class Subscription
    attr_reader :publisher, :event, :handler

    def initialize(publisher, event, handler)
      @publisher = publisher
      @event = event
      @handler = handler
    end

    def unsubscribe
      @publisher.unsubscribe(self)
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
cyberarm_engine-0.19.0 lib/cyberarm_engine/ui/event.rb