jupyter-make-client: Do boilerplate in less specialized methods

This commit is contained in:
Nathaniel Nicandro 2019-05-10 19:12:51 -05:00
parent 0f06ea1407
commit eaf6478aa3

View file

@ -275,17 +275,25 @@ argument of the process."
"Make a new client from CLASS connected to MANAGER's kernel. "Make a new client from CLASS connected to MANAGER's kernel.
SLOTS are the slots used to initialize the client with.") SLOTS are the slots used to initialize the client with.")
(cl-defmethod jupyter-make-client ((manager jupyter-kernel-manager) class &rest slots) (cl-defmethod jupyter-make-client :before (_manager class &rest _slots)
"Signal an error if CLASS is not a subclass of `jupyter-kernel-client'."
(unless (child-of-class-p class 'jupyter-kernel-client)
(signal 'wrong-type-argument (list '(subclass jupyter-kernel-client) class))))
(cl-defmethod jupyter-make-client (manager class &rest slots)
"Return an instance of CLASS using SLOTS and its manager slot set to MANAGER."
(let ((client (apply #'make-instance class slots)))
(prog1 client
(oset client manager manager))))
(cl-defmethod jupyter-make-client ((manager jupyter-kernel-manager) _class &rest _slots)
"Make a new client from CLASS connected to MANAGER's kernel. "Make a new client from CLASS connected to MANAGER's kernel.
CLASS should be a subclass of `jupyter-kernel-client', a new CLASS should be a subclass of `jupyter-kernel-client', a new
instance of CLASS is initialized with SLOTS and configured to instance of CLASS is initialized with SLOTS and configured to
connect to MANAGER's kernel." connect to MANAGER's kernel."
(unless (child-of-class-p class 'jupyter-kernel-client) (let ((client (cl-call-next-method)))
(signal 'wrong-type-argument (list '(subclass jupyter-kernel-client) class)))
(let ((client (apply #'make-instance class slots)))
(with-slots (kernel) manager (with-slots (kernel) manager
(prog1 client (prog1 client
(oset client manager manager)
;; TODO: We can also have the manager hold the kcomm object and just ;; TODO: We can also have the manager hold the kcomm object and just
;; pass a single kcomm object to all clients using this manager since the ;; pass a single kcomm object to all clients using this manager since the
;; kcomm broadcasts event to all connected clients. This is more ;; kcomm broadcasts event to all connected clients. This is more