Sha256: 067470c273883cf57055e0d3f8edb92419a45799fa15c631954ddc5633238078

Contents?: true

Size: 1.56 KB

Versions: 1

Compression:

Stored size: 1.56 KB

Contents

module Botfly
  class CommonBlockAcceptor
    extend Forwardable

    attr_reader :block_state, :responders
    
    def initialize(*ignored)
      @block_state = {}
      @responders = {}
    end
    
    def respond_to(type,params);  
      raise "AbstractMethodError: Implement in subclass" 
    end

    def [](key)
      @block_state[key]
    end
    
    def []=(key, set_to)
      @block_state[key] = set_to
    end

    def remove_responder(id_to_remove)
      Botfly.logger.info("#{self.to_debug_s}: Removing responder #{id_to_remove}")
      @responders.each { |pair| key,chain = pair; chain.reject! {|r| r.id == id_to_remove } }
    end
    
    def on
      return OnRecognizer.new(self)
    end
    
    class OnRecognizer
      def initialize(obj); @obj = obj; end

      def method_missing(name,&block)
        @type = name
        Botfly.logger.info("#{@obj.to_debug_s}: Bot#on")
        
        (@obj.responders[name] ||= []) << responder = klass.new(@obj, &block)
        Botfly.logger.info("#{@obj.to_debug_s}: #{@obj.class_prefix}#{name.to_s.capitalize}Responder added to responder chain")
        return responder
      end
      
      private
      def klass
        begin
          klass = Botfly.const_get(@obj.class_prefix + @type.to_s.split('_').map(&:capitalize).join + "Responder")
        rescue
          if @obj.class_prefix.empty?
            klass = Responder
          else
            klass = Botfly.const_get(@obj.class_prefix+"Responder")
          end
        end
      end
    end
    
    def class_prefix; ''; end
    def to_debug_s;   ''; end

  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
botfly-0.3.6 lib/botfly/common_block_acceptor.rb