```ruby
module Fluffle
  module Handlers
    class Dispatcher < Base
      def initialize
        @routes = []

        yield self if block_given?
      end

      # pattern - Right now just a String that 1-to-1 matches the `method`
      # block - Block to call with the `params`
      def handle(pattern, &block)
        @routes << [pattern, block]
      end

      def call(method:, params:,  **_)
        @routes.each do |(pattern, block)|
          next if pattern != method

          return block.call(*params)
        end

        raise NoMethodError, "Undefined method '#{method}'"
      end
    end
  end
end
```

Add some documentation for the `Dispatcher` handler
user
```ruby
module Fluffle
  module Handlers
    # Lightweight DSL for defining handler blocks for a given message
    #
    # Examples
    #
    #   dispatcher = Fluffle::Handlers::Dispatcher.new
    #   dispatcher.handle('upcase') { |str| str.upcase }
    #
    #   # Also exposed through the `Fluffle::Server#drain` method
    #   server.drain do |dispatcher|
    #     dispatcher.handle('upcase') { |str| str.upcase }
    #   end
    #
    class Dispatcher < Base
      def initialize
        @routes = []

        yield self if block_given?
      end

      # pattern - Right now just a String that 1-to-1 matches the `method`
      # block - Block to call with the `params`
      def handle(pattern, &block)
        @routes << [pattern, block]
      end

      def call(method:, params:,  **_)
        @routes.each do |(pattern, block)|
          next if pattern != method

          return block.call(*params)
        end

        raise NoMethodError, "Undefined method '#{method}'"
      end
    end
  end
end
```
assistant