Eric Mahurin wrote: >What's the advantage of this over: > >foo = Foo.new >foo.bar = "hello" >foo.baz = 5 >foo.zap = "world" > > 1. To avoid, having to call a configure method after configuration parameters have been set (or before certain instance methods are called), 2. to guarantee, that no Foo objects are created, that aren't configured correctly. Consider this contrived example: class Foo FIELDS = %w[bar baz zap] attr_accessor(*FIELDS) def initialize if block_given? yield self configure else raise ArgumentError, "configuration required!" end end def configure for f in FIELDS __send__(f) or raise ArgumentError, "configuration for #{f} missing!" end @greeting = [ @bar ] * @baz * ', ' + " #@zap!" end def greet puts @greeting end end f = Foo.new do |f| f.bar = "hello" f.baz = 5 f.zap = "world" end f.greet After the configuration block has been executed, f is guaranteed to be a correctly configured Foo instance. (At least no parameter has been forgotten, but further checks are possible as well.)