Config
Config containing items and associated values.
Config contains items, which can be loaded with addSpec. Config contains values, each of which is associated with corresponding item. Values can be loaded from source with withSource or from.
Config contains read-write access operations for item. Items in config is in one of three states:
Unset. Item has not associated value in this state. Use unset to change item to this state.
Unevaluated. Item is lazy and the associated value will be evaluated when accessing. Use lazySet to change item to this state.
Evaluated. Item has associated value which is evaluated. Use set to change item to this state.
Config is cascading. Config can fork from another config by adding a new layer on it. The forked config is called child config, and the original config is called parent config. A config without parent config is called root config. The new layer added by child config is called facade layer. Config with ancestor configs has multiple layers. All set operation is executed in facade layer of config. Descendant config inherits items and values in ancestor configs, and can override values for items in ancestor configs. Overridden values in config will affect itself and its descendant configs, without affecting its ancestor configs. Loading items in config will not affect its ancestor configs too. invoke can be used to create a root config, and withLayer can be used to create a child config from specified config.
All methods in Config is thread-safe.