Under shoulda known but didn't.

Ruby methods can have defaults:

def hello(message: 'World')
puts "hello #{message}"
end

The default can call an initializer:

class Greeting
def initialize(message)
@message = message
end

def message
@message
end
end

def hello(message: Greeting.new)
puts "hello #{message.message}"
end

And the initializer can take parameters:

class Greeting
def initialize(message = 'there')
@message = message
end

def message
@message
end
end

def hello(message: Greeting.new('World'))
puts "hello #{message.message}"
end

And you can refer to earlier argument values:

class Greeting
def initialize(message = 'there')
@message = message
end

def message
@message
end
end

def hello(announcement: 'gorgeous', message: Greeting.new(announcement))
puts "hello #{message.message}"
end