Object extend [ as: similarClass [ ^similarClass newFrom: self ] ]
Object subclass: PrimePrice [
| value |
value [ ^value ]
value: newValue [ value := newValue ]
]
PrimePrice class extend [
value: value [ ^self new value: value; yourself ]
]
Object subclass: MarginPrice [
| originalPrice |
setOriginalPrice: price [ originalPrice := price ]
]
MarginPrice class extend [
newFrom: price [ ^self new setOriginalPrice: price; yourself ]
]
MarginPrice subclass: DoublePrice [ value [ ^originalPrice value * 2 ] ]
MarginPrice subclass: WholesalePrice [
| advantage |
value [ ^originalPrice value + advantage ]
advantage: newAdvantage [ advantage := newAdvantage ]
]
(((((((PrimePrice value: 120)
as: DoublePrice)
as: WholesalePrice) advantage: 80)
as: DoublePrice)
as: WholesalePrice) advantage: 200;
value) displayNl
T2JqZWN0IGV4dGVuZCBbIGFzOiBzaW1pbGFyQ2xhc3MgWyBec2ltaWxhckNsYXNzIG5ld0Zyb206IHNlbGYgXSBdCgpPYmplY3Qgc3ViY2xhc3M6IFByaW1lUHJpY2UgWwoJfCB2YWx1ZSB8Cgl2YWx1ZSBbIF52YWx1ZSBdCgl2YWx1ZTogbmV3VmFsdWUgWyB2YWx1ZSA6PSBuZXdWYWx1ZSBdCl0KClByaW1lUHJpY2UgY2xhc3MgZXh0ZW5kIFsgCgl2YWx1ZTogdmFsdWUgWyBec2VsZiBuZXcgdmFsdWU6IHZhbHVlOyB5b3Vyc2VsZiBdIApdCgpPYmplY3Qgc3ViY2xhc3M6IE1hcmdpblByaWNlIFsKCXwgb3JpZ2luYWxQcmljZSB8CglzZXRPcmlnaW5hbFByaWNlOiBwcmljZSBbIG9yaWdpbmFsUHJpY2UgOj0gcHJpY2UgXQpdCgpNYXJnaW5QcmljZSBjbGFzcyBleHRlbmQgWyAKCW5ld0Zyb206IHByaWNlIFsgXnNlbGYgbmV3IHNldE9yaWdpbmFsUHJpY2U6IHByaWNlOyB5b3Vyc2VsZiBdIApdCgpNYXJnaW5QcmljZSBzdWJjbGFzczogRG91YmxlUHJpY2UgWyB2YWx1ZSBbIF5vcmlnaW5hbFByaWNlIHZhbHVlICogMiBdIF0KCk1hcmdpblByaWNlIHN1YmNsYXNzOiBXaG9sZXNhbGVQcmljZSBbCgl8IGFkdmFudGFnZSB8Cgl2YWx1ZSBbIF5vcmlnaW5hbFByaWNlIHZhbHVlICsgYWR2YW50YWdlIF0KCWFkdmFudGFnZTogbmV3QWR2YW50YWdlIFsgYWR2YW50YWdlIDo9IG5ld0FkdmFudGFnZSBdCl0KCigoKCgoKChQcmltZVByaWNlIHZhbHVlOiAxMjApIAoJYXM6IERvdWJsZVByaWNlKSAKCQlhczogV2hvbGVzYWxlUHJpY2UpIGFkdmFudGFnZTogODApIAoJCQlhczogRG91YmxlUHJpY2UpIAoJCQkJYXM6IFdob2xlc2FsZVByaWNlKSBhZHZhbnRhZ2U6IDIwMDsKIHZhbHVlKSBkaXNwbGF5Tmw=