(declare (hide swig-initialize))

(define (swig-initialize obj initargs create)
     (slot-set! obj 'swig-this
        (if (memq 'swig-this initargs)
            (cadr initargs)
            (let ((ret (apply create initargs)))
              (if (instance? ret)
                (slot-ref ret 'swig-this)
                ret)))))

(define-class <swig-metaclass-$module> (<class>) (void))

(define-method (compute-getter-and-setter (class <swig-metaclass-$module>) slot allocator)
  (if (not (memq ':swig-virtual slot))
    (call-next-method)
    (let ((getter (let search-get ((lst slot))
                    (if (null? lst)
                      #f
                      (if (eq? (car lst) ':swig-get)
                        (cadr lst)
                        (search-get (cdr lst))))))
          (setter (let search-set ((lst slot))
                    (if (null? lst)
                      #f
                      (if (eq? (car lst) ':swig-set)
                        (cadr lst)
                        (search-set (cdr lst)))))))
      (values
        (lambda (o) (getter (slot-ref o 'swig-this)))
	(lambda (o new) (setter (slot-ref o 'swig-this) new) new)))))