Invoke mechanism for defining specific and fix to attach config child
This commit is contained in:
parent
1b879eccc7
commit
736ec621b0
@ -15,6 +15,13 @@ interface Specific : Configurable
|
|||||||
|
|
||||||
operator fun Specific.get(name: String): MetaItem<*>? = config[name]
|
operator fun Specific.get(name: String): MetaItem<*>? = config[name]
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Editor for specific objects
|
||||||
|
*/
|
||||||
|
inline operator fun <S : Specific> S.invoke(block: S.() -> Unit): Unit {
|
||||||
|
run(block)
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Allows to apply custom configuration in a type safe way to simple untyped configuration.
|
* Allows to apply custom configuration in a type safe way to simple untyped configuration.
|
||||||
* By convention [Specific] companion should inherit this class
|
* By convention [Specific] companion should inherit this class
|
||||||
@ -69,8 +76,12 @@ class SpecDelegate<T : Specific, S : Specification<T>>(
|
|||||||
val spec: S,
|
val spec: S,
|
||||||
val key: Name? = null
|
val key: Name? = null
|
||||||
) : ReadWriteProperty<Any?, T> {
|
) : ReadWriteProperty<Any?, T> {
|
||||||
|
|
||||||
override fun getValue(thisRef: Any?, property: KProperty<*>): T {
|
override fun getValue(thisRef: Any?, property: KProperty<*>): T {
|
||||||
return target.config[key ?: property.name.asName()]?.node?.let { spec.wrap(it) } ?: spec.empty()
|
val name = key ?: property.name.asName()
|
||||||
|
return target.config[name]?.node?.let { spec.wrap(it) } ?: (spec.empty().also {
|
||||||
|
target.config[name] = it.config
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun setValue(thisRef: Any?, property: KProperty<*>, value: T) {
|
override fun setValue(thisRef: Any?, property: KProperty<*>, value: T) {
|
||||||
|
Loading…
Reference in New Issue
Block a user