def [](key)
@current_nesting_level << key
@has_been_read = true
if @set_type
a_value = @set_type == :automatic ? value_or_descend(current_automatic, key, auto_vivifiy_on_read) : nil
o_value = @set_type == :override ? value_or_descend(current_override, key, auto_vivifiy_on_read) : nil
n_value = @set_type == :normal ? value_or_descend(current_normal, key, auto_vivifiy_on_read) : nil
d_value = @set_type == :default ? value_or_descend(current_default, key, auto_vivifiy_on_read) : nil
determine_value(a_value, o_value, n_value, d_value)
else
a_value = value_or_descend(current_automatic, key)
o_value = value_or_descend(current_override, key)
n_value = value_or_descend(current_normal, key)
d_value = value_or_descend(current_default, key)
determine_value(a_value, o_value, n_value, d_value)
end
end