class ConfigurationObject implements IObject {

    @Override
    public Object getValue(final IFieldName name)
            throws ReadValueException, InvalidArgumentException {
        if (null == name) {
            throw new InvalidArgumentException("Name parameter should not be null.");
        }
        try {
            if (canonizedBody.containsKey(name)) {
                return canonizedBody.get(name);
            }

            Object canonicalValue = IOC.resolve(
                    IOC.resolve(IOC.getKeyForKeyStorage(), "resolve key for configuration object"),
                    name,
                    body.get(name)
            );

            // ConcurrentHashMap does not permit null-values
            if (null != canonicalValue) {
                canonizedBody.put(name, canonicalValue);
            }
            return canonicalValue;
        } catch (Throwable e) {
            throw new ReadValueException("Can't read value for current field name", e);
        }
    }

    public  ConfigurationObject(final String body);
    public  ConfigurationObject(final Map<IFieldName, Object> objectEntries);
    public  ConfigurationObject();

}