33 lines
661 B
Plaintext
33 lines
661 B
Plaintext
uses objectclass;
|
|
define :class Delegator;
|
|
slot delegate = false;
|
|
enddefine;
|
|
|
|
define :class Delegate;
|
|
enddefine;
|
|
|
|
define :method thing(x : Delegate);
|
|
'delegate implementation'
|
|
enddefine;
|
|
|
|
define :method operation(x : Delegator);
|
|
if delegate(x) and fail_safe(delegate(x), thing) then
|
|
;;; Return value is on the stack
|
|
else
|
|
'default implementation'
|
|
endif;
|
|
enddefine;
|
|
|
|
;;; Default, without a delegate
|
|
lvars a = newDelegator();
|
|
operation(a) =>
|
|
|
|
;;; a delegating to itself (works because Delegator does not
|
|
;;; implement thing)
|
|
a -> delegate(a);
|
|
operation(a) =>
|
|
|
|
;;; delegating to a freshly created Delegate
|
|
newDelegate() -> delegate(a);
|
|
operation(a) =>
|