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
