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. #=> 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]. #=> {1 => :baz}
hash.foo[o].[1] #=> :baz