(let ((name (car mob-head)) (attr (cdr mob-head)))
`(define ,(string->symbol (string-concatenate (list "make-" (symbol->string name))))
(lambda* ,(if (null? attr) '() `(#:key ,@attr))
- (lambda-mob () ,@body)))))
+ (the-mob ',name () ,attr ,@body)))))
-(define-macro (lambda-mob attr . body)
+(define-macro (the-mob type attr publish . body)
(let ((mob-id-symbol (gensym))
- (type-mob
- `(let ,(cons `(,mob-id-symbol (gensym)) attr)
+ (type-symbol (gensym)))
+ `(let ((,mob-id-symbol (gensym))
+ (,type-symbol ,type)
+ ,@attr)
(lambda* (#:optional (option #f))
(define (kill-me)
(hide-mob-hash ,mob-id-symbol))
(case option
((get-mob-id)
,mob-id-symbol)
+ ((get-type)
+ ,type-symbol)
(else
(catch #t
(lambda () ,@body)
- (lambda (key . args) #f))))))))
+ (lambda (key . args) #f))
+ (cond ((not (null? ,publish))
+ (display ,(cons 'list (map (lambda (x) `(cons ',(car x) ,(car x))) publish)))
+ (publish-mob-data ,mob-id-symbol ,type-symbol ,(cons 'list (map (lambda (x) `(cons ',(car x) ,(car x))) publish)))))
+ (newline)))))))
+
+(define-macro (lambda-mob attr . body)
+ `(the-mob 'undefined ,attr '() ,@body))
+
+
+;;; Events Engine
+
+(define publish-mob-data #f)
+(define published-data (make-hash-table))
+
+(let ((nop #f))
+ (set! publish-mob-data
+ (lambda (mob-id mob-type data)
+ (let ((t (hash-ref published-data mob-type))
+ (i (cons mob-id data)))
+ (hash-set! published-data mob-type
+ (cond (t (cons i t))
+ (else (list i))))))))