bang method names are a matter of preference of course, but i think most ruby devs would expect the non-bang to return nil, and the bang to raise an error.

this is a lot of duplicated code... how about having get take an optional block that is called and its value returned if the field is not set. then the raise version just becomes:

```ruby
def get!(*nested_field_names)
  get(*nested_field_names) { raise(ArgumentError, "field not set") }
end
```

and then you could also do calls like

```ruby
value = get('a', 'b', 'c') { my_custom_default_value }
```