class EacRubyUtils::Struct

def [](key)

def [](key)
  key, bool = parse_key(key)
  bool ? self[key].present? : data[key]
end

def fetch(key)

def fetch(key)
  key, bool = parse_key(key)
  bool ? fetch(key).present? : data.fetch(key)
end

def initialize(initial_data = {})

def initialize(initial_data = {})
  self.data = ::ActiveSupport::HashWithIndifferentAccess.new(initial_data)
end

def method_missing(method_name, *arguments, &block)

def method_missing(method_name, *arguments, &block)
  property_method?(method_name) ? fetch(method_name) : super
end

def parse_key(key)

def parse_key(key)
  m = /\A(.+)\?\z/.match(key.to_s)
  [(m ? m[1] : key.to_s).to_sym, m ? true : false]
end

def property_method?(key)

def property_method?(key)
  property_methods.include?(key.to_sym)
end

def property_methods

def property_methods
  data.keys.flat_map { |k| [k.to_sym, "#{k}?".to_sym] }
end

def respond_to_missing?(method_name, include_private = false)

def respond_to_missing?(method_name, include_private = false)
  property_method?(method_name) || super
end