I've been trying to make some deeper inquiry. It turns out that the case is not as simple as I thought.
(define (parent-methods method class)
(let* ((supers (class-direct-supers class))
(super? (lambda(c)(find (lambda(s)(eq? c s)) supers))))
(filter-map (match-lambda((method (? super? super) args ...) method) (else #f))
(map (lambda(m)(cons m (method-specializers m)))
(generic-function-methods method)))))
it works more or less as expected, at least for initializers (because it is defined in such way that it only looks at the method's first argument) -- it does return a list of parents' initializers.
The problem appears if a parent's initializer contains (next-method) invocation. Otherwise (if there's no call to (next-method)) the method contains a procedure in its 'procedure' slot, which can be accessed using `method-procedure`, and then called or applied in a regular manner.
However, if there is a call to (next-method) in a macro, the `method-procedure` called on such method returns #f. I think the idea is that methods are meant to be called from the context of `apply-generic` and next-method is a continuation, but I haven't figured out how it works exactly.
Anyway, the thing isn't as simple as I thought and perhaps someone else could try another approach.
Sorry for causing confusion!
M.