Background
In a large system, we may encounter configurations from different sources. For example, we can store configurations in custom settings, or some custom SObjects. Even we can read configurations from external web services. So configurations are grouped by where they come from, and when we want to use the configs, we need to know their sources. However, what we ideally want is that our configurations are grouped by features and functions, and we don't want to be disturbed by where the configs come from and how we should access the configs. Under this background, we have the idea of building a config system, which provides a unified API that gives a consistent access to our configurations.