Sha256: 59731b5b0ed08019746d546443defa302f52110b8d7daf50948fe6ae245150a9

Contents?: true

Size: 1.84 KB

Versions: 6

Compression:

Stored size: 1.84 KB

Contents

# encoding: utf-8

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? ? @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 queue?
      instance_variable_defined? :@queue
    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 instance_variable_defined?(:@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

6 entries across 6 versions & 1 rubygems

Version Path
adhearsion-2.0.0 lib/adhearsion/events.rb
adhearsion-2.0.0.rc5 lib/adhearsion/events.rb
adhearsion-2.0.0.rc4 lib/adhearsion/events.rb
adhearsion-2.0.0.rc3 lib/adhearsion/events.rb
adhearsion-2.0.0.rc2 lib/adhearsion/events.rb
adhearsion-2.0.0.rc1 lib/adhearsion/events.rb