Delegation can be accounted for by making the delegate references into caller references, and adding an indirection to the call of the delegated actualization so that the caller now matches the intended delegate.
For example
# With _delegate_
printName: {
print(Delegate lastName)
}
John: {
lastName: "Wilkins"
}
John printName: printName
John printName() # > "Wilkins"
# With _caller_
printName: {
print(Caller lastName)
}
John: {
lastName: "Sagan"
printName: {
Parent Parent printName()
}
}
John printName() # > "Sagan"
It is still to be seen if there are no side effects other than verbosity. There probably are.
Empty values not intended to be filled with values provided by the argument can be accounted for by a using the Private Data Object design pattern.
For example:
actualizeMe: {
fillable
alsoFillable
notSo: {
privateProperty
laissezFaire
}
}
actualized: actualizeMe( "filling", "this one too", "private you say?" )
actualized fillable # > "filling"
actualized alsoFillable # "this one too"
actualized notSo # { privateProperty: Ø, laissezFaire: Ø }
In the last example, what should happen to the
"private you say?"
string? It all suggests that it should be stored within theactualized
Description.