aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/guile/skribilo/engine.scm47
1 files changed, 25 insertions, 22 deletions
diff --git a/src/guile/skribilo/engine.scm b/src/guile/skribilo/engine.scm
index 0622e11..163fe06 100644
--- a/src/guile/skribilo/engine.scm
+++ b/src/guile/skribilo/engine.scm
@@ -107,23 +107,10 @@
(customs :init-keyword :custom :init-value '())
(symbol-table :init-keyword :symbol-table :init-value '()))
-(define-class <engine> ()
+(define-class <engine> (<object>)
(customs :init-keyword :customs :init-value '())
:metaclass <engine-class>)
-(define-method (compute-cpl (class <engine-class>))
- ;; Automatically set the class precedence list of <engine> subclasses.
- (format (current-error-port) "computing CPL for ~a~%" class)
- (list class <engine> <top>))
-
-(define-method (initialize (engine-class <engine-class>) . args)
- ;; Set the name of <engine> subclasses.
- (let ((result (next-method))
- (ident (slot-ref engine-class 'ident)))
- (slot-set! engine-class 'name
- (symbol-append '<engine: ident '>))
- result))
-
(define %format format)
(define* (make-engine-class ident :key (version 'unspecified)
@@ -133,7 +120,11 @@
(symbol-table '())
(custom '())
(info '()))
- (let ((e (make <engine-class>
+ ;; We use `make-class' from `(oop goops)' (currently undocumented).
+ (let ((e (make-class (list <engine>) '()
+ :metaclass <engine-class>
+ :name (symbol-append '<engine: ident '>)
+
:ident ident :version version :format format
:filter filter :delegate delegate
:symbol-table symbol-table
@@ -169,27 +160,34 @@
(define (engine? obj)
(is-a? obj <engine>))
+(define (engine-class e)
+ (and (engine? e) (class-of e)))
+
;; A mapping of engine classes to hooks.
(define %engine-instantiate-hook (make-hash-table))
-(define-method (initialize (engine <engine>) . args)
- (format (current-error-port) "initializing engine ~a~%" engine)
- engine)
-
(define-method (make-instance (class <engine-class>) . args)
+ (define (initialize-engine! engine)
+ ;; Automatically initialize the `customs' slot of the newly created
+ ;; engine.
+ (let ((init-values (engine-class-customs class)))
+ (slot-set! engine 'customs (map list-copy init-values))
+ engine))
+
(format #t "making engine of class ~a~%" class)
(let ((engine (next-method)))
(if (engine? engine)
- (let ((hook (hashq-ref %engine-instantiate-hook engine-class)))
+ (let ((hook (hashq-ref %engine-instantiate-hook class)))
(format (current-error-port) "engine made: ~a~%" engine)
+ (initialize-engine! engine)
(if (hook? hook)
(run-hook hook engine class))
engine)
engine)))
(define (make-engine engine-class)
- (make engine-class
- :customs (list-copy (slot-ref engine-class 'customs))))
+ (make engine-class))
+
;; Convenience functions.
@@ -209,6 +207,11 @@
(string=? fmt (engine-format e)))))
+
+;;;
+;;; Writers.
+;;;
+
(define (engine-class-add-writer! e ident pred upred opt before action
after class valid)
;; Add a writer to engine class E. If IDENT is a symbol, then it should