Hash object with struct access. Main purpose is to be a configuration object.

Warning: It can't be modified after initialization.

# Simple example
hash = HashWithStructAccess.new(:foo => {:bar => 42})
hash.foo #=> {:bar => 42}
hash.foo.bar #=> 42

# More complex example
hash = HashWithStructAccess.new(:foo => {(o = Object.new) => {"bar" => {1 => :baz}}})
hash.foo #=> {o => {"bar" => {1 => :baz}}}
hash.foo[o] #=> {"bar" => {1 => :baz}}
hash.foo[o].bar #=> {1 => :baz}
hash.foo[o].bar[1] #=> :baz