ianwhite/heed

View on GitHub
lib/heed/listener.rb

Summary

Maintainability
A
0 mins
Test Coverage
module Heed
  # A Listener holds a dispatcher, which it dispatches messages to
  #
  # A listener is by default a 'strict' listener, it will raise NoMethodError if
  # it is sent a message it doesn't know how to handle.
  #
  # A listener can be turned into a 'lax' listener, by sending it the #lax message.
  # A lax listener will silently swallow any unknown messages.
  class Listener
    def self.new *args, &block
      self == Listener ? StrictListener.new(*args, &block) : super(*args, &block)
    end

    attr_reader :dispatcher

    def initialize(*args, &block)
      @dispatcher = Dispatcher.from(*args, &block)
      freeze
    end

    def strict
      StrictListener.new dispatcher
    end

    def lax
      LaxListener.new dispatcher
    end

    def hark *args, &block
      self.class.new dispatcher, *args, &block
    end
  end

  class StrictListener < Listener
    def respond_to?(method, *args)
      super || dispatcher.handles?(method)
    end

    def method_missing *args, &block
      results = dispatcher.handle(*args, &block)
      if results.length > 0
        results
      else
        super
      end
    end
  end

  class LaxListener < Listener
    def respond_to? *args
      true
    end

    def method_missing *args, &block
      dispatcher.handle(*args, &block)
    end
  end
end