Object subclass: #Door instanceVariableNames: 'closed knob' classVariableNames: '' poolDictionaries: '' category: 'RPT-Door'! !Door methodsFor: 'initialization' stamp: 'Y2Gx9wEv 3/30/2017 12:33'! initialize closed := true. knob := Knob newFor: self! ! !Door methodsFor: 'testing' stamp: 'Y2Gx9wEv 3/30/2017 12:38'! canBeOpened ^ self isOpen or: [knob isLatchedOff]! ! !Door methodsFor: 'testing' stamp: 'Y2Gx9wEv 3/30/2017 12:39'! isClose ^ closed! ! !Door methodsFor: 'testing' stamp: 'Y2Gx9wEv 3/30/2017 12:39'! isOpen ^ self isClose not! ! !Door methodsFor: 'accessing' stamp: 'Y2Gx9wEv 3/30/2017 12:39'! knob ^ knob! ! !Door methodsFor: 'interaction' stamp: 'Y2Gx9wEv 3/30/2017 12:38'! pull closed := true. knob unturn! ! !Door methodsFor: 'interaction' stamp: 'Y2Gx9wEv 3/30/2017 12:38'! push self canBeOpened ifTrue: [closed := false]! ! "-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "! Door class instanceVariableNames: ''! !Door class methodsFor: 'examples' stamp: 'Y2Gx9wEv 3/30/2017 12:13'! example "Door example" | door | Transcript cr; cr; show: 'door is a Door...'. door := Door new. door knob turn. Transcript cr; show: 'door knob turn. door canBeOpened. => ', door canBeOpened printString. door knob unturn. Transcript cr; show: 'door knob unturn. door canBeOpened. => ', door canBeOpened printString. door push. Transcript cr; show: 'door push; isOpen. => ', door isOpen printString. door knob turn. door push. Transcript cr; show: 'door knob turn. door push; isOpen. => ', door isOpen printString. door pull. Transcript cr; show: 'door pull; isOpen. => ', door isOpen printString. Transcript cr; show: 'door canBeOpened. => ', door canBeOpened printString.! ! Door subclass: #DoorWithCloser instanceVariableNames: 'delay' classVariableNames: '' poolDictionaries: '' category: 'RPT-Door'! !DoorWithCloser methodsFor: 'initialization' stamp: 'Y2Gx9wEv 3/30/2017 12:49'! initialize super initialize. delay := 3 seconds! ! !DoorWithCloser methodsFor: 'interaction' stamp: 'Y2Gx9wEv 3/30/2017 1:44'! push super push. self isOpen ifTrue: [[delay asDelay wait. self pull] fork]! ! !DoorWithCloser methodsFor: 'accessing' stamp: 'Y2Gx9wEv 3/30/2017 12:23'! delay: duration delay := duration! ! "-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "! DoorWithCloser class instanceVariableNames: ''! !DoorWithCloser class methodsFor: 'examples' stamp: 'Y2Gx9wEv 3/30/2017 12:37'! example "DoorWithCloser example" | door | Transcript cr; cr; show: 'door is a DoorWithCloser...'. door := DoorWithCloser new. door knob turn. door push. Transcript cr; show: 'door knob turn. door push; isOpen. => ', door isOpen printString. Transcript cr; show: '1 second after'. 1 seconds asDelay wait. Transcript show: ', door isOpen. => ', door isOpen printString. Transcript cr; show: '4 seconds after'. 3 seconds asDelay wait. Transcript show: ', door isOpen. => ', door isOpen printString.! ! Object subclass: #Knob instanceVariableNames: 'door latched' classVariableNames: '' poolDictionaries: '' category: 'RPT-Door'! !Knob methodsFor: 'testing' stamp: 'Y2Gx9wEv 3/30/2017 12:11'! isLatchedOff ^ latched not! ! !Knob methodsFor: 'interaction' stamp: 'Y2Gx9wEv 3/30/2017 12:12'! turn latched := false! ! !Knob methodsFor: 'interaction' stamp: 'Y2Gx9wEv 3/30/2017 12:11'! unturn door isClose ifTrue: [latched := true]! ! !Knob methodsFor: 'initialization' stamp: 'Y2Gx9wEv 3/30/2017 12:11'! initialize latched := true! ! !Knob methodsFor: 'private' stamp: 'Y2Gx9wEv 3/30/2017 12:12'! setDoor: newDoor door := newDoor! ! "-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "! Knob class instanceVariableNames: ''! !Knob class methodsFor: 'instance creation' stamp: 'Y2Gx9wEv 3/30/2017 12:14'! newFor: door ^ self new setDoor: door; yourself! ! Trait named: #TDoorStopper uses: #() category: 'RPT-Door'! !TDoorStopper methodsFor: 'testing' stamp: 'Y2Gx9wEv 3/30/2017 12:23'! isStoppered ^ self stoppered! ! !TDoorStopper methodsFor: 'interaction' stamp: 'Y2Gx9wEv 3/30/2017 12:22'! beStopperedOff self stoppered: false! ! !TDoorStopper methodsFor: 'interaction' stamp: 'Y2Gx9wEv 3/30/2017 12:22'! beStopperedOn self stoppered: true! ! !TDoorStopper methodsFor: 'interaction' stamp: 'Y2Gx9wEv 3/30/2017 12:22'! pull self isStoppered ifFalse: [super pull]! ! !TDoorStopper methodsFor: 'interaction' stamp: 'Y2Gx9wEv 3/30/2017 12:22'! push self beStopperedOff. super push! ! Door subclass: #DoorWithStopper uses: TDoorStopper instanceVariableNames: 'stoppered' classVariableNames: '' poolDictionaries: '' category: 'RPT-Door'! !DoorWithStopper methodsFor: 'accessing' stamp: 'Y2Gx9wEv 3/30/2017 12:23'! stoppered ^ stoppered! ! !DoorWithStopper methodsFor: 'accessing' stamp: 'Y2Gx9wEv 3/30/2017 12:23'! stoppered: bool stoppered := bool! ! "-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "! DoorWithStopper class uses: TDoorStopper classTrait instanceVariableNames: ''! !DoorWithStopper class methodsFor: 'examples' stamp: 'Y2Gx9wEv 3/30/2017 12:14'! example "DoorWithStopper example" | door | Transcript cr; cr; show: 'door is a DoorWithStopper...'. door := DoorWithStopper new. door knob turn. door push. Transcript cr; show: 'door knob turn. door push; isOpen. => ', door isOpen printString. door beStopperedOn; pull. Transcript cr; show: 'door beStopperedOn; pull; isClose. => ', door isClose printString. door beStopperedOff; pull. Transcript cr; show: 'door beStopperedOff; pull; isClose. => ', door isClose printString. door knob turn. door push. Transcript cr; show: 'door knob turn. door push; isOpen. => ', door isOpen printString. door beStopperedOn; pull. Transcript cr; show: 'door beStopperedOn; pull; isClose. => ', door isClose printString. door push; pull. Transcript cr; show: 'door push; pull; isClose. => ', door isClose printString. ! ! DoorWithCloser subclass: #DoorWithStopperCloser uses: ((TDoorStopper @ {#aliasBeStopperedOff->#beStopperedOff}) - {#push}) instanceVariableNames: 'stoppered' classVariableNames: '' poolDictionaries: '' category: 'RPT-Door'! !DoorWithStopperCloser methodsFor: 'interaction' stamp: 'Y2Gx9wEv 3/30/2017 12:20'! beStopperedOff self push! ! !DoorWithStopperCloser methodsFor: 'interaction' stamp: 'Y2Gx9wEv 3/30/2017 12:20'! push self aliasBeStopperedOff. super push! ! !DoorWithStopperCloser methodsFor: 'accessing' stamp: 'Y2Gx9wEv 3/30/2017 12:23'! stoppered ^ stoppered! ! !DoorWithStopperCloser methodsFor: 'accessing' stamp: 'Y2Gx9wEv 3/30/2017 12:23'! stoppered: bool stoppered := bool! ! "-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "! DoorWithStopperCloser class uses: TDoorStopper classTrait instanceVariableNames: ''! !DoorWithStopperCloser class methodsFor: 'examples' stamp: 'Y2Gx9wEv 3/30/2017 12:14'! example "DoorWithStopperCloser example" | door | Transcript cr; cr; show: 'door is a DoorWithStopperCloser...'. door := DoorWithStopperCloser new. door knob turn. door push. Transcript cr; show: 'door knob turn. door push; isOpen. => ', door isOpen printString. door beStopperedOn. Transcript cr; show: 'door beStopperedOn. then 4 seconds after'. 4 seconds asDelay wait. Transcript show: ', door isClose. => ', door isClose printString. door beStopperedOff. Transcript cr; show: 'door beStopperedOff. then 4 seconds after'. 4 seconds asDelay wait. door push. Transcript show: ', door isClose. => ', door isClose printString. door knob turn. door push. Transcript cr; show: 'door knob turn. door push; isOpen. => ', door isOpen printString. door beStopperedOn. Transcript cr; show: 'door beStopperedOn. then 4 seconds after'. 4 seconds asDelay wait. Transcript show: ', door isClose. => ', door isClose printString. door push. Transcript cr; show: 'door push. then 4 seconds after'. 4 seconds asDelay wait. door push. Transcript show: ', door isClose. => ', door isClose printString.! !