Created
July 20, 2011 14:38
-
-
Save et4te/1095082 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| (asdf:oos 'asdf:load-op :contextl) | |
| (in-package :contextl-user) | |
| (defclass grouped-layer (standard-layer-class) ()) | |
| (defgeneric group-root (layer)) | |
| (defgeneric default-layer (layer)) | |
| (define-layered-method adjoin-layer-using-class | |
| ((to-add grouped-layer) active-layers) | |
| (call-next-layered-method | |
| to-add | |
| (remove-layer (group-root (find-layer to-add)) active-layers))) | |
| (define-layered-method remove-layer-using-class | |
| ((to-remove grouped-layer) active-layers) | |
| (declare (ignore active-layers)) | |
| (multiple-value-bind | |
| (new-layers cacheablep) | |
| (call-next-method) | |
| (values | |
| (adjoin-layer (default-layer (find-layer to-remove)) new-layers) | |
| cacheablep))) | |
| (deflayer output () | |
| ((group-root :initform 'output :reader group-root) | |
| (default-layer :initform 'standard-output :reader default-layer))) | |
| (deflayer standard-output (output) () | |
| (:metaclass grouped-layer)) | |
| (deflayer html-output (output) () | |
| (:metaclass grouped-layer)) | |
| (deflayer xml-output (output) () | |
| (:metaclass grouped-layer)) | |
| (deflayer json-output (output) () | |
| (:metaclass grouped-layer)) | |
| (define-layered-function make-output () | |
| (:method () '(output)) | |
| (:method :in standard-output () | |
| (list* 'standard-output (call-next-method))) | |
| (:method :in html-output () | |
| (list* 'html-output (call-next-method))) | |
| (:method :in xml-output () | |
| (list* 'xml-output (call-next-method))) | |
| (:method :in json-output () | |
| (list* 'json-output (call-next-method)))) | |
| (assert (equal (make-output) '(output))) | |
| (with-active-layers (standard-output) | |
| (assert (equal (make-output) '(standard-output output))) | |
| (with-active-layers (html-output) | |
| (assert (equal (make-output) '(html-output output))) | |
| (with-active-layers (xml-output) | |
| (assert (equal (make-output) '(xml-output output))) | |
| (with-inactive-layers (xml-output) | |
| (assert (equal (make-output) '(standard-output output)))) | |
| (assert (equal (make-output) '(xml-output output)))) | |
| (assert (equal (make-output) '(html-output output)))) | |
| (assert (equal (make-output) '(standard-output output)))) | |
| (print :done) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment