# Symbols Inject values instead of services. Insprired by [Apache Tapestry Symbols](https://tapestry.apache.org/symbols.html). ## Concept The general idea is that you define can define values that are injected by a `SymbolKey` into properties with the `@Symbol` annotation. This allows to separate the values from their usage. For example, we use it to have all API-related code in a shared dependency, but the correct host is defined as a symbol. Like `Registry`, you provide a factory for the symbol creation. ## Types of Symbols There are three methods available: * `Symbols.constant`: The symbol is a constant. Instead of a factory, the value can be provided directly. * `Symbols.lazy`: The symbol is evaluated on first use. * `Symbols.dynamic`: The symbol factory is evaluated on every access. All three have the argument `isDefault: Bool = false` which marks the Symbol as overridable. Non-`default` Symbols can't be overriden and will throw a `fatalError`. Also, registering two `default` Symbols under the same key is forbidden. ## SymbolKeys Strings can be used to identify a `Symbol`. But to easier access all available Symbols, you should use a `SymbolKey` instead, by extending it: ```swift import IntegralSwift public extension SymbolKey { static let apiHost = SymbolKey("api-host") } @Symbol(.apiHost) var host: String ```