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)

Download commonDesignPatterns_library.ek9