Sha256: 05631f570658fe492ee0ba0252fd6b10c907a8a48443af547a05822952453eec

Contents?: true

Size: 1.72 KB

Versions: 4

Compression:

Stored size: 1.72 KB

Contents

module Adhearsion
  class Events

    include HasGuardedHandlers

    Message = Struct.new :type, :object

    class << self
      def method_missing(method_name, *args, &block)
        instance.send method_name, *args, &block
      end

      def respond_to?(method_name)
        instance.respond_to?(method_name) || super
      end

      def instance
        @@instance || refresh!
      end

      def refresh!
        @@instance = new
      end
    end

    refresh!

    def queue
      @queue || reinitialize_queue!
    end

    def trigger(type, object = nil)
      queue.push_async Message.new(type, object)
    end

    def trigger_immediately(type, object = nil)
      queue.push_immediately Message.new(type, object)
    end

    def reinitialize_queue!
      GirlFriday.shutdown! if @queue
      # TODO: Extract number of threads to use from Adhearsion.config
      @queue = GirlFriday::WorkQueue.new 'main_queue', :error_handler => ErrorHandler do |message|
        begin
          handle_message message
        rescue Exception => e
          ErrorHandler.new.handle e
        end
      end
    end

    def handle_message(message)
      trigger_handler message.type, message.object
    end

    def draw(&block)
      instance_exec &block
    end

    def method_missing(method_name, *args, &block)
      register_handler method_name, *args, &block
    end

    def respond_to?(method_name)
      return true if @handlers && @handlers.has_key?(method_name)
      super
    end

    alias :register_callback :register_handler

    private

    def call_handler(handler, guards, event)
      super && throw(:pass)
    end

    class ErrorHandler
      def handle(exception)
        Events.trigger :exception, exception
      end
    end

  end
end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
adhearsion-2.0.0.beta1 lib/adhearsion/events.rb
adhearsion-2.0.0.alpha3 lib/adhearsion/events.rb
adhearsion-2.0.0.alpha2 lib/adhearsion/events.rb
adhearsion-2.0.0.alpha1 lib/adhearsion/events.rb