anchor.diff:  
   ;;; Creatures, Players.
   
  -(defclass creature-controller ()
  -  ((creature :type (or creature (unsigned-byte 128) null)
  -             :accessor creature-controller-creature 
  -             :initarg :creature
  -             :documentation "If this controller is currently controlling
  -             a creature, this is a reference to that creature; either an
  -             ID, or the creature object."))
  -  (:documentation "A base class used for any entity (eg, player) who can
  - control a character in the game in some way."))
  -
  -(defclass player (creature-controller)
  -  ((player-id :type (unsigned-byte 128) :accessor player-id
  -              :initform (binary<-uuid (uuid:make-v4-uuid))
  -              :documentation  "A  128-bit  unique  identifier  for  this
  -player, used  internally. We  are generating  these using  v4-UUID's, at
  -least for now, although other than being a positive integer, I would not
  -recommend making any assumptions about their internal format.")
  -   (player-email :type (or string null) :accessor player-email
  -                 :initform :email
  -                 :documentation "The  primary e-mail  address associated
  -with this player.  The player's contact methods list  may have alternate
  -addresses, and there  is no guarantee that this “primary”  address is as
  -good as, much less better than, any  of them. This value may be used for
  -display  only,  but before  actually  sending  mail, visit  the  contact
  -methods list and find the actual best address.
  -
  -This may also be NIL.")
  -   (player-given-name :type (or string null) :accessor player-given-name
  -                      :initform :given-name
  -                      :documentation "The player's  given name (usually,
  -first name) if one is known. This may be NIL.")
  -   (player-surname :type (or string null) :accessor player-surname
  -                   :initform :surname
  -                   :documentation "The player's surname (family name, or
  -last name) if one is known. This may be NIL.")
  -   (player-full-name :type (or string null) :accessor player-full-name
  -                     :initform :full-name
  -                     :documentation "The  player's full  name, formatted
  -as they  like it. This might  include honorifics or titles;  there is no
  -safe way to convery between this and the given name and surname.")
  -   (player-date-of-birth :type (or local-time:date null) :accessor player-date-of-birth
  -                         :initform :date-of-birth
  -                         :documentation "The player's date of birth, if it is known.")
  -   (player-age :type (or (real 0 *) null) :accessor player-age
  -               :initform :age
  -               :documentation  "The  player's  age,   if  it  is  known.
  -Note that the reader method will  compute the age from the date-of-birth
  -when one is present."))
  -  (:documentation "A class representing a player who is a human being in
  - the real world."))
  -
  -
  -
  -(defun legal-age (date-of-birth)
  -  "The age of  a person born on DATE-OF-BIRTH, right  now. This uses the
  -legal definition  that the  person's age increments  at the  midnight of
  -their date  of birth  each year,  with the date  29 February  treated as
  -1 March on non-leap-years.
  +;; (defmodel creature-controller
  +;;   (:inflate registered-at #'datetime-to-timestamp) 
  +;;   id 
  +;;   registered-at)
  +
  +;; (defclass creature-controller ()
  +;;   ((creature :type (or creature (unsigned-byte 128) null)
  +;;              :accessor creature-controller-creature 
  +;;              :initarg :creature
  +;;              :documentation "If this controller is currently controlling
  +;;              a creature, this is a reference to that creature; either an
  +;;              ID, or the creature object."))
  +;;   (:documentation "A base class used for any entity (eg, player) who can
  +;;  control a character in the game in some way."))
  +
  +(datafly:defmodel player
  +  "A  structure representing  a  player  who is  a  human  being in  the
  + real world.
  +
  +Structure slots:
  +
  +@itemize  @item ID  
  +
  +A 128-bit  unique identifier  for this player,  used internally.  We are
  +generating these using v4-UUID's, at  least for now, although other than
  +being a positive  integer, I would not recommend  making any assumptions
  +about their internal format.
  +
  +@item EMAIL
  +
  +The primary  e-mail address  associated with  this player.  The player's
  +contact  methods list  may have  alternate  addresses, and  there is  no
  +guarantee that  this “primary” address is  as good as, much  less better
  +than, any of them.  This value may be used for  display only, but before
  +actually  sending mail,  visit the  contact  methods list  and find  the
  +actual best address.
  +
  +This may also be NIL.
  +
  +@item GIVEN-NAME
  +
  +The player's given name (usually, first  name) if one is known. This may
  +be NIL.
  +
  +@item SURNAME
  +
  +The  player's surname  (family  name, or  last name)  if  one is  known.
  +This may be NIL.
  +
  +@item FULL-NAME
  +
  +The player's  full name, formatted as  they like it. This  might include
  +honorifics or titles;  there is no safe way to  convery between this and
  +the given name and surname.
  +
  +@item DATE-OF-BIRTH
  +
  +The player's date of birth, if it is known.
  +
  +@item AGE
  +
  +The  player's age,  if it  is known.  Note that  the reader  method will
  +compute the age from the date-of-birth when one is present.
  +
  +For sanity-checking purposes only, the age  is clamped to 0…130. This is
  +mostly to detect the not-uncommon  data-entry error of someone supplying
  +a  two-digit year-of-birth  that  is later  interpreted  as their  being
  +1,900+ years old.
  +
  +@end itemize"
  +  (id (binary<-uuid (uuid:make-v4-uuid))
  +      :type (unsigned-byte 128))
  +  (email nil :type (or string null))
  +  (given-name nil :type (or string null))
  +  (surname nil :type (or string null))
  +  (full-name nil :type (or string null))
  +  (date-of-birth nil :type (or local-time:date null))
  +  (age nil :type (or (real 0 (130)) null))) 
  +
  +(defun legal-age (date-of-birth &optional (reference-date (local-time:now)))
  +  "The age of  a person born on DATE-OF-BIRTH, as  of REFERENCE-DATE (or
  +right  now).  This uses  the  legal  definition  that the  person's  age
  +increments at  the midnight of their  date of birth each  year, with the
  +date 29 February treated as 1 March on non-leap-years.
   
   The time  zone used for  this computation  is the not  defined, however,
   yielding  rather  irregular  behaviour   depending  on  time  zones  and
  
positive.code: 
  TODO: Determine  in what  time zone  we should  computer this  for legal
  reasons, eg, COPPA."
    (multiple-value-bind (msec sec min hour day month year)
        (local-time:decode-timestamp (local-time:now))
      (declare (ignore msec sec min hour))
      (multiple-value-bind (_1 _2 _3 _4
                               day-of-birth month-of-birth year-of-birth)
          (local-time:decode-timestamp date-of-birth)
        (declare (ignore _1 _2 _3 _4))
        (let ((had-birthday-p (or (< month-of-birth month)
                                  (and (= month-of-birth month)
                                       (<= day-of-birth day)))))
          (+ (- year year-of-birth 1)
             (if had-birthday-p 1 0))))))
  
  (defmethod player-age :around (player)
    "This  AROUND method  will define  the PLAYER's  age based  upon their
  
negative.code:     (player player)
      ((integer 1 *) (find-player-by-id player))
      (string (find-player-by-id (parse-integer player :radix 36)))))
  
  