* lib.scm: Move module the system directives `export',
[bpt/guile.git] / oop / goops / active-slot.scm
CommitLineData
14f1d9fe
MD
1;;; installed-scm-file
2
71d540f7 3;;;; Copyright (C) 1999, 2001 Free Software Foundation, Inc.
14f1d9fe
MD
4;;;;
5;;;; This program is free software; you can redistribute it and/or modify
6;;;; it under the terms of the GNU General Public License as published by
7;;;; the Free Software Foundation; either version 2, or (at your option)
8;;;; any later version.
9;;;;
10;;;; This program is distributed in the hope that it will be useful,
11;;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
12;;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13;;;; GNU General Public License for more details.
14;;;;
15;;;; You should have received a copy of the GNU General Public License
16;;;; along with this software; see the file COPYING. If not, write to
17;;;; the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
18;;;; Boston, MA 02111-1307 USA
c22adbeb
MV
19;;;;
20;;;; As a special exception, the Free Software Foundation gives permission
21;;;; for additional uses of the text contained in its release of GUILE.
22;;;;
23;;;; The exception is that, if you link the GUILE library with other files
24;;;; to produce an executable, this does not by itself cause the
25;;;; resulting executable to be covered by the GNU General Public License.
26;;;; Your use of that executable is in no way restricted on account of
27;;;; linking the GUILE library code into it.
28;;;;
29;;;; This exception does not however invalidate any other reasons why
30;;;; the executable file might be covered by the GNU General Public License.
31;;;;
32;;;; This exception applies only to the code released by the
33;;;; Free Software Foundation under the name GUILE. If you copy
34;;;; code from other Free Software Foundation releases into a copy of
35;;;; GUILE, as the General Public License permits, the exception does
36;;;; not apply to the code that you add in this way. To avoid misleading
37;;;; anyone as to the status of such modified files, you must delete
38;;;; this exception notice from them.
39;;;;
40;;;; If you write modifications of your own for GUILE, it is your choice
41;;;; whether to permit this exception to apply to your modifications.
42;;;; If you do not wish that, delete this exception notice.
14f1d9fe
MD
43;;;;
44\f
45
46;;;; This software is a derivative work of other copyrighted softwares; the
47;;;; copyright notices of these softwares are placed in the file COPYRIGHTS
48;;;;
49;;;; This file is based upon active-slot.stklos from the STk
50;;;; distribution by Erick Gallesio <eg@unice.fr>.
51;;;;
52
53(define-module (oop goops active-slot)
1a179b03
MD
54 :use-module (oop goops internal)
55 :export (<active-class>))
14f1d9fe
MD
56
57(define-class <active-class> (<class>))
58
71d540f7 59(define-method (compute-get-n-set (class <active-class>) slot)
14f1d9fe
MD
60 (if (eq? (slot-definition-allocation slot) #:active)
61 (let* ((index (slot-ref class 'nfields))
62 (name (car slot))
63 (s (cdr slot))
64 (env (class-environment class))
65 (before-ref (get-keyword #:before-slot-ref s #f))
66 (after-ref (get-keyword #:after-slot-ref s #f))
67 (before-set! (get-keyword #:before-slot-set! s #f))
68 (after-set! (get-keyword #:after-slot-set! s #f))
69 (unbound (make-unbound)))
70 (slot-set! class 'nfields (+ index 1))
71 (list (lambda (o)
72 (if before-ref
73 (if (before-ref o)
74 (let ((res (%fast-slot-ref o index)))
75 (and after-ref (not (eqv? res unbound)) (after-ref o))
76 res)
77 (make-unbound))
78 (let ((res (%fast-slot-ref o index)))
79 (and after-ref (not (eqv? res unbound)) (after-ref o))
80 res)))
81
82 (lambda (o v)
83 (if before-set!
84 (if (before-set! o v)
85 (begin
86 (%fast-slot-set! o index v)
87 (and after-set! (after-set! o v))))
88 (begin
89 (%fast-slot-set! o index v)
90 (and after-set! (after-set! o v)))))))
91 (next-method)))