ok, after some mailing with Kenny - this works:
(defpackage CellsChat (:use :cl :cells)) (in-package :CellsChat)
(defparameter *newline* (princ-to-string #\Newline))
(defmodel Participant () ((chat :cell nil :accessor chat-of :initarg :chat :initform (error "Participants need something for its `chat'-slot."))
(username :cell nil :accessor username-of :initarg :username :initform (error "CellsChat needs a `username'."))
(speech :cell :ephemeral :accessor speech-of :initarg :speech :initform (c-in nil))))
(defmethod initialize-instance :after ((participant Participant) &key) (push participant (participants-of (chat-of participant))))
(defobserver speech ((participant Participant)) ;; `new-value' always refers to the slot `speech' ;; since that is what we're observing (when new-value (dolist (participant (participants-of (chat-of participant))) (format t "Update interface for '~A', appending: ~A~%" (username-of participant) new-value))))
(defmethod say ((participant Participant) (what string)) (setf (speech-of participant) (concatenate 'string (username-of participant) ": " what *newline*)))
(defmodel Chat () ((text-box :accessor text-box-of :initform (c? (concatenate 'string ;; conversation till now.. (or .cache "") ;; well, ok then - this is neat O_o (some 'speech-of (participants-of self)))))
(participants :accessor participants-of :initform (c-in nil))))
(defun testChat () (let* ((chat (make-instance 'Chat)) (user1 (make-instance 'Participant :username "user1" :chat chat)) (user2 (make-instance 'Participant :username "user2" :chat chat))) (say user1 "Hello, anyone here?") (say user2 "Well hello there - I'm here :)") (say user1 "Cool .. what's up?") (say user2 "Just doing some Lisp-hacking -- you?") (say user1 "Naaaw .. nothing; I'm kind of tired, so I'm just sitting in the sun here listening to some music")))
..pretty darn cool :)