class Kangaru::Config

def [](key)

def [](key)
  configurators[key.to_sym]
end

def errors

def errors
  configurators.values.flat_map(&:errors)
end

def import!(path)

def import!(path)
  read_external_config(path).each do |key, config|
    configurators[key]&.merge!(**config)
  end
end

def initialize

def initialize
  @configurators = set_configurators!
end

def read_external_config(path)

def read_external_config(path)
  return {} unless File.exist?(path)
  YAML.load_file(path)&.symbolise || {}
end

def serialise

def serialise
  configurators.transform_values(&:serialise)
end

def set_configurators!

def set_configurators!
  Configurators.classes.to_h do |configurator_class|
    self.class.class_eval { attr_reader configurator_class.key }
    configurator = configurator_class.new
    instance_variable_set(:"@#{configurator_class.key}", configurator)
    [configurator_class.key, configurator]
  end
end

def valid?

def valid?
  validate
  errors.empty?
end

def validate

def validate
  configurators.each_value(&:validate)
end