persistable abstract sclass AbstractJuicer extends MetaWithChangeListeners { // what we are monitoring & closing (a position or a strategy) settableWithVar Juiceable juiceable; settableWithVar double juiceValue; settableWithVar bool closingAllowed = true; // last calculated signals settableWithVar L currentSignals; settableWithVar L suppressedSignals; event calculatingCloseSignals(L outList); // must return a new list swappable L calculateCloseSignals() { grabJuiceValue(); new L signals; calculatingCloseSignals(signals); if (closingAllowed) { suppressedSignals(emptyList()); currentSignals(signals); } else { suppressedSignals(signals); currentSignals(emptyList()); } ret currentSignals; } void grabJuiceValue { juiceValue(juiceable.juiceValue()); } selfType configClone() { ret restructure(this); } void copyTransientValuesFrom(AbstractJuicer juicer) {} }