In this example, I’m creating a User object such that I can set the name using my own DSL:
class User def initialize &block if block.arity == 1 block[self] else instance_eval &block end end def name new_name = nil @name ||= new_name end def location new_location = nil @location ||= new_location end def occupation new_occupation = nil @occupation ||= new_occupation end end u = User.new do name "Travis Jeffery" location "Toronto, Ontario" occupation "Mathematician, Software Engineer" end ### # # > u.name # => "Travis Jeffery" # > u.location # => "Toronto, Ontario" # > u.occupation # => "Mathematician, Software Engineer"
The reason for checking the arity of the block given is so you can support the case when a user of our API would use it like so:
u = User.new do |u| u.name "Travis Jeffery" end
Personally, I’d be inclined to support only one interface—my preference being the first one.