The following pattern would work to add timeouts to the existing method signature without the need for a second, separate method to maintain, while also opening up the possibility for additional options to be added in a clean manner; we would then handle an options hash with `:timeout` key in the `_subscription` method:

~~~ ruby
  # Listen for messages published to the given channels.
  # @overload subscribe(*channels, options = {}, &block)
  #   @param *channels [String]
  #   @param options [Hash{Symbol=>Object}]
  #   @options option [Integer] :timeout (0) the timeout in seconds
  def subscribe(*channels, &block)
    options = (channels.last.kind_of?(Hash) ? channels.pop : {})
    options[:timeout] ||= 0
    synchronize do |client|
      _subscription(:subscribe, channels, options, block)
    end
  end
~~~