+(defgeneric set-new-mode (base-mode new-mode))
+(defmethod set-new-mode ((m base-mode) new-mode)
+ (let* ((c (connection m))
+ (mode (make-mode c new-mode)))
+ (setf (connection-mode c) mode)))
+
+(defgeneric handle-data (base-mode message))
+(defgeneric handle-init (base-mode message))
+(defgeneric handle-prompt (base-mode message))
+
+(defmethod handle-init ((m init-mode) message)
+ (declare (ignorable message))
+ (with-slots (play-sent-p) m
+ (if (not play-sent-p)
+ (progn
+ (play (connection m))
+ (setf play-sent-p t))
+ (set-new-mode m 'play-mode))))
+
+(defmethod handle-prompt ((m play-mode) message)
+ (let* ((c (connection m))
+ (log (logging-stream c)))
+ (format log "handle-data ~a~%" message)))
+
+(defmethod handle-prompt ((m play-mode) message)
+ (let* ((c (connection m))
+ (log (logging-stream c)))
+ (format log "handle-prompt ~a~%" message)))
+
+(defparameter *line-type-dispatch*
+ (list `(,+C_DATA+ . handle-data)
+ `(,+C_INIT+ . handle-init)
+ `(,+C_PROMPT+ . handle-prompt)))