I love it! I'm not sure why builder switches the position of its content argument depeding on block vs. immediate: builder.tag("content", "attr1"=>"val1", "attr2"=>"val2") vs. builder.tag("attr1"=>"val1", "attr2"=>"val2") { content } Why not consistently use 1st position for node attribute, 2nd position for nested node content? I hope it is not just to get the Ruby convenience of not needing {} around trailing hash argument. Thanks!