module Prism

class Dispatcher < Visitor
  attr_reader listeners: Hash[Symbol, Array[untyped]]

  def initialize: () -> void
  def register: (untyped, *Symbol) -> void
  def register_public_methods: (untyped) -> void
  def dispatch: (Prism::node) -> void
  def dispatch_once: (Prism::node) -> void

  private def register_events: (untyped, Array[Symbol]) -> void

  class DispatchOnce < Visitor
    attr_reader listeners: Hash[Symbol, Array[untyped]]

    def initialize: (Hash[Symbol, Array[untyped]]) -> void
  end
end

end