neopoly/rohbau

View on GitHub
lib/rohbau/event_tube.rb

Summary

Maintainability
A
0 mins
Test Coverage
module Rohbau
  class EventTube
    def self.reset
      @subscriptions = nil
    end

    def self.publish(name, event)
      subscription_handler.handle(name, event)
    end

    def self.subscribe(name, &handler)
      subscription_handler.add(name, &handler)
    end

    def self.subscription_handler
      @subscriptions ||= SubscriptionHandler.new
    end

    class SubscriptionHandler
      def initialize
        @subscriptions = Hash.new do |h, k|
          h[k] = []
        end
      end

      def add(name, &handler)
        subscriptions[name] << handler
        true
      end

      def handle(name, event)
        subscriptions[name].each do |handler|
          handler.call(event)
        end
        true
      end

      private

      attr_reader :subscriptions
    end
  end
end