def method_missing(name, *args, &block)
      sym_name = name.to_sym
      return fetch(sym_name) if key?(sym_name)
      str_name = name.to_s
      modifier = str_name[-1]
      return super unless %w[? !].include?(modifier)
      base = str_name[0...-1].to_sym
      known = key?(base)
      return known if modifier == '?'
      return fetch(base) if known
      raise Errors::StateMissing, base
    end
def method_missing(name, *args, &block)
      sym_name = name.to_sym
      return fetch(sym_name) if key?(sym_name)
      str_name = name.to_s
      modifier = str_name[-1]
      return super unless %w[? !].include?(modifier)
      base = str_name[0...-1].to_sym
      known = key?(base)
      return known if modifier == '?'
      return fetch(base) if known
      raise Errors::StateMissing, base
    end
Dynamically pass unknown messages to the underlying state storage

 State fields become accessible through readers, like in an
 {http://ruby-doc.org/stdlib-2.0.0/libdoc/ostruct/rdoc/OpenStruct.html OpenStruct}.
 A single state field can be questioned for existence by having its name
 followed by a question mark - eg. bacon?.
 A single state field can be force-accessed by having its name followed by
 an exclamation mark - eg. bacon!.

 This method reeks of :reek:TooManyStatements.

 @param name [Symbol|String]
 @param args [Array<Object>]
 @param block [Proc]

 @return [Object]
 @raise [NoMethodError]
 @raise [Errors::StateMissing]
 @api private
 @example
   state = Statefully::State.create(bacon: 'tasty')

   state.bacon
   => "tasty"

   state.bacon?
   => true

   state.bacon!
   => "tasty"

   state.cabbage
   NoMethodError: undefined method `cabbage' for #<Statefully::State::Success bacon="tasty">
           [STACK TRACE]

   state.cabbage?
   => false

   state.cabbage!
   Statefully::Errors::StateMissing: field 'cabbage' missing from state
           [STACK TRACE]