def with_context(params)
  k, name = catch(:context) {yield; return}
  k.call(params[name] || find_in_context(name))
end
def find_in_context(name)
  callcc{|k| throw(:context, [k, name])}
end

def update_widget
  name = find_in_context(:name)
  color = find_in_context(:color)
  puts "<#{color}>#{name}</#{color}>"
end

with_context(   :name => 'dave', :color => 'red' ) do
  with_context( :name => 'avi',  :color => 'green' ) do
    update_widget               #=> "<green>avi</green>"
  end
  update_widget                 #=> "<red>dave</red>"
end
