anchor.diff:    ((source-port :initform nil :initarg :source-port :accessor source-port-of)
      (target-port :initform nil :initarg :target-port :accessor target-port-of)))
   
  -(defclass attributed (port-mixin)
  -  ((attributes :initform nil :initarg :attributes :accessor attributes-of)
  -   (object :initarg :object :accessor object-of))
  +(defclass attributed (attributes-mixin
  +                      port-mixin)
  +  ((object :initarg :object :accessor object-of))
     (:documentation "Wraps an object (initarg :OBJECT) with `dot` attribute
   information (a plist, initarg :ATTRIBUTES)"))
   
  
positive.code: 
  (defvar *id*)
  
  (defclass graph ()
    ((attributes :initform nil :initarg :attributes :accessor attributes-of)
     (nodes :initform nil :initarg :nodes :accessor nodes-of)
     (edges :initform nil :initarg :edges :accessor edges-of)))
  
  (defclass node ()
    ((attributes :initform nil :initarg :attributes :accessor attributes-of)
     (id :initform (incf *id*) :initarg :id :accessor id-of))
    (:documentation "A graph node with `dot` attributes (a plist, initarg
  :ATTRIBUTES) and an optional `dot` id (initarg :ID, autogenerated
  by default)."))
  
negative.code:   (print-unreadable-object (object stream :type t :identity t)
      (format stream "~A" (object-of object))))
  
  (defclass edge (attributes-mixin
                  port-mixin)
    ((source :initform nil :initarg :source :accessor source-of)
     (target :initform nil :initarg :target :accessor target-of)))
  
  ;;; Protocol functions
  