"the original definition of class Price"
Object subclass: Price [
| value |
init [ value := 0 ]
value [ ^value ]
value: newValue [ value := newValue ]
]
Price class extend [
new [ ^ super new init; yourself ]
value: value [ ^self new value: value; yourself ]
]
"tweaks for accepting decorations"
Price extend [
| decorators |
decorators [ ^decorators ifNil: [ decorators := OrderedCollection new ] ]
value [ ^self decorators inject: value into: [ :acc :deco | deco value: acc ] ]
]
"usage example"
| price |
price := Price value: 120.
price decorators
add: [:x | x * 2];
add: [:x | x + 80];
add: [:x | x * 2];
add: [:x | x + 200].
price value displayNl.
(price value: 100; value) displayNl
InRoZSBvcmlnaW5hbCBkZWZpbml0aW9uIG9mIGNsYXNzIFByaWNlIgoKT2JqZWN0IHN1YmNsYXNzOiBQcmljZSBbCiAgIHwgdmFsdWUgfAogICBpbml0IFsgdmFsdWUgOj0gMCBdCiAgIHZhbHVlIFsgXnZhbHVlIF0KICAgdmFsdWU6IG5ld1ZhbHVlIFsgdmFsdWUgOj0gbmV3VmFsdWUgXQpdCgpQcmljZSBjbGFzcyBleHRlbmQgWwogICBuZXcgWyBeIHN1cGVyIG5ldyBpbml0OyB5b3Vyc2VsZiBdCiAgIHZhbHVlOiB2YWx1ZSBbIF5zZWxmIG5ldyB2YWx1ZTogdmFsdWU7IHlvdXJzZWxmIF0KXQoKCiJ0d2Vha3MgZm9yIGFjY2VwdGluZyBkZWNvcmF0aW9ucyIKClByaWNlIGV4dGVuZCBbCiAgIHwgZGVjb3JhdG9ycyB8CiAgIGRlY29yYXRvcnMgWyBeZGVjb3JhdG9ycyBpZk5pbDogWyBkZWNvcmF0b3JzIDo9IE9yZGVyZWRDb2xsZWN0aW9uIG5ldyBdIF0KICAgdmFsdWUgWyBec2VsZiBkZWNvcmF0b3JzIGluamVjdDogdmFsdWUgaW50bzogWyA6YWNjIDpkZWNvIHwgZGVjbyB2YWx1ZTogYWNjIF0gXQpdCgoKInVzYWdlIGV4YW1wbGUiCgp8IHByaWNlIHwKcHJpY2UgOj0gUHJpY2UgdmFsdWU6IDEyMC4KcHJpY2UgZGVjb3JhdG9ycwogICBhZGQ6IFs6eCB8IHggKiAyXTsgCiAgIGFkZDogWzp4IHwgeCArIDgwXTsgCiAgIGFkZDogWzp4IHwgeCAqIDJdOyAKICAgYWRkOiBbOnggfCB4ICsgMjAwXS4KcHJpY2UgdmFsdWUgZGlzcGxheU5sLgoocHJpY2UgdmFsdWU6IDEwMDsgdmFsdWUpIGRpc3BsYXlObA==