def fetch(attr_name)
      stringified_key = attr_name.to_s
      if attribute_names.include?(stringified_key) || attribute_aliases.key?(stringified_key)
        public_send(stringified_key)
      else
        message = attr_name.is_a?(Symbol) ? "key not found: :#{attr_name}" : "key not found: #{attr_name}"
        raise KeyError, message
      end
    end
Returns an Object, similar to Hash#fetch, raises
a KeyError if attr_name doesn't exist.
@param attr_name [String, Symbol]

@return Object