(set-dispatch-macro-character #\# #\{ 'c-fragment-reader) (progn (clear-the-decks) (define-sod-class "Animal" ("SodObject") :nick 'nml :link '|SodObject| (slot "tickles" int) (instance-initializer "nml" "tickles" :single #{ 0 }) (message "tickle" (fun void)) (method "nml" "tickle" (fun void) #{ me->tickles++; } :role :before) (method "nml" "tickle" (fun void) #{ })) (define-sod-class "Lion" ("Animal") :nick 'lion :link '|Animal| (message "bite" (fun void)) (method "lion" "bite" (fun void) nil) (method "nml" "tickle" (fun void) #{ me->_vt->lion.bite(me); CALL_NEXT_METHOD; })) (define-sod-class "Goat" ("Animal") :nick 'goat (message "butt" (fun void)) (method "goat" "butt" (fun void) nil) (method "nml" "tickle" (fun void) #{ me->_vt->goat.bite(me); CALL_NEXT_METHOD; })) (define-sod-class "Serpent" ("Animal") :nick 'serpent (message "bite" (fun void)) (method "serpent" "bite" (fun void) nil) (message "hiss" (fun void)) (method "serpent" "hiss" (fun void) nil) (method "nml" "tickle" (fun void) #{ if (me->tickles < 3) me->_vt->hiss(me); else me->_vt->bite(me); CALL_NEXT_METHOD; })) (define-sod-class "Chimaera" ("Lion" "Goat" "Serpent") :nick 'sir :link '|Lion|) (defparameter *chimaera* (find-sod-class "Chimaera")) (defparameter *emeth* (find "tickle" (sod-class-effective-methods *chimaera*) :key (lambda (method) (sod-message-name (effective-method-message method))) :test #'string=)))