Object subclass: Machine [
wakeUp [ ^self ]
sleep [ ^self ]
hi [ self subclassResponsibility ]
state [ ^self class displayNl ]
Other := nil.
]
Machine class extend [
new [ ^WakeUp basicNew ]
]
Machine subclass: WakeUp [
hi [ 'hello' displayNl ]
]
Machine subclass: Sleep [
hi [ 'zzz...' displayNl ]
]
Machine extend [ Other := Sleep basicNew ]
WakeUp extend [
sleep [ ^self become: Other ]
]
Sleep extend [ wakeUp [
^self become: Other ]
]
| machine |
machine := Machine new.
machine state. "=> WakeUp "
machine hi. "=> hello "
machine sleep; state. "=> Sleep "
machine hi. "=> zzz... "
machine wakeUp; state. "=> WakeUp "
machine wakeUp; state. "=> WakeUp "
machine sleep; state. "=> Sleep "
machine sleep; state. "=> Sleep "
T2JqZWN0IHN1YmNsYXNzOiBNYWNoaW5lIFsKCXdha2VVcCBbIF5zZWxmIF0KCXNsZWVwIFsgXnNlbGYgXQoJaGkgWyBzZWxmIHN1YmNsYXNzUmVzcG9uc2liaWxpdHkgXQoJc3RhdGUgWyBec2VsZiBjbGFzcyBkaXNwbGF5TmwgXQoJT3RoZXIgOj0gbmlsLgpdCgpNYWNoaW5lIGNsYXNzIGV4dGVuZCBbCgluZXcgWyBeV2FrZVVwIGJhc2ljTmV3IF0KXQoKTWFjaGluZSBzdWJjbGFzczogV2FrZVVwIFsKCWhpIFsgJ2hlbGxvJyBkaXNwbGF5TmwgXQpdCgpNYWNoaW5lIHN1YmNsYXNzOiBTbGVlcCBbCgloaSBbICd6enouLi4nIGRpc3BsYXlObCBdCl0KCk1hY2hpbmUgZXh0ZW5kIFsgT3RoZXIgOj0gU2xlZXAgYmFzaWNOZXcgXQoKV2FrZVVwIGV4dGVuZCBbCglzbGVlcCBbIF5zZWxmIGJlY29tZTogT3RoZXIgXQpdCgpTbGVlcCBleHRlbmQgWyB3YWtlVXAgWwoJXnNlbGYgYmVjb21lOiBPdGhlciBdCl0KCnwgbWFjaGluZSB8Cm1hY2hpbmUgOj0gTWFjaGluZSBuZXcuCm1hY2hpbmUgc3RhdGUuICI9PiBXYWtlVXAgIgptYWNoaW5lIGhpLiAiPT4gaGVsbG8gIgptYWNoaW5lIHNsZWVwOyBzdGF0ZS4gIj0+IFNsZWVwICIKbWFjaGluZSBoaS4gIj0+IHp6ei4uLiAiCm1hY2hpbmUgd2FrZVVwOyBzdGF0ZS4gIj0+IFdha2VVcCAiCm1hY2hpbmUgd2FrZVVwOyBzdGF0ZS4gIj0+IFdha2VVcCAiCm1hY2hpbmUgc2xlZXA7IHN0YXRlLiAiPT4gU2xlZXAgIgptYWNoaW5lIHNsZWVwOyBzdGF0ZS4gIj0+IFNsZWVwICI=