A configurable library service: a record built by functions
The complete source of commonDesignPatterns_library.ek9, compiled by the EK9 compiler. Shown on commonDesignPatterns.html.
#!ek9 defines module site.commonDesignPatterns.library defines record ConfigurationDetails name <- String() useMapping <- Boolean() frequencyOfChecks <- Integer() default ConfigurationDetails() as pure ConfigurationDetails() as pure -> initializer as Consumer of ConfigurationDetails initializer(this) ConfigurationDetails() as pure -> copyFrom as ConfigurationDetails this :=: copyFrom ConfigurationDetails() as pure -> initializer as Consumer of ConfigurationDetails copyFrom as ConfigurationDetails initializer(this) this :=: copyFrom operator :=: -> copyFrom as ConfigurationDetails name :=? String(copyFrom.name) useMapping :=? Boolean(copyFrom.useMapping) frequencyOfChecks :=? Integer(copyFrom.frequencyOfChecks) default operator ? default operator $ defines class SomeConfigurableService configuration as ConfigurationDetails: ConfigurationDetails() //With no configuration given, the library's defaults are used. SomeConfigurableService() as pure configuration :=? ConfigurationDetails(defaultConfiguration) SomeConfigurableService() as pure -> useConfiguration as ConfigurationDetails configuration :=? ConfigurationDetails(useConfiguration) underTakeServiceOperations() as pure stdout <- Stdout() if configuration.name? stdout.println(`Processing Service operation for ${configuration.name}`) if configuration.useMapping stdout.println(`Will use mapping`) if configuration.frequencyOfChecks? stdout.println(`Processing Service frequency ${configuration.frequencyOfChecks}`) configurationDetails() as pure <- rtn as String: $configuration default operator ? defines function //The fallback: sets only what nothing else has set. Each builder below applies it last. defaultConfiguration() as pure -> details as ConfigurationDetails details.name :=? "default" details.useMapping :=? false details.frequencyOfChecks :=? 6 applyConfigurations() -> changes as List of Acceptor of ConfigurationDetails <- configuration as ConfigurationDetails: ConfigurationDetails() for change in changes change(configuration) defaultConfiguration(configuration) applyConfiguration() -> change as Acceptor of ConfigurationDetails <- configuration as ConfigurationDetails: ConfigurationDetails() change(configuration) defaultConfiguration(configuration) conditionallyApplyConfigurations() as pure -> changes as List of Consumer of ConfigurationDetails <- configuration as ConfigurationDetails: ConfigurationDetails() for change in changes change(configuration) defaultConfiguration(configuration) conditionallyApplyConfiguration() as pure -> change as Consumer of ConfigurationDetails <- configuration as ConfigurationDetails: ConfigurationDetails() change(configuration) defaultConfiguration(configuration)