     redis.zrangebyscore [@key(), stamp, stamp], (err, res) ->
       return cb(err) if err
       return cb("Not found") unless res.length > 0
-      cb(null, new Comic(res[0], stamp, saved: true))
+
+      # If we found a comic, we'll stuff what we know about it
+      # and invoke `Comic#update` and pass our callback down to it
+      # to be invoked whtn the structure is fully filled in
+      (new Comic(res[0], stamp, saved: true)).update(cb)
 
 
+  # Fetch the latest comic and invoke cb as in `Comic.at`
   @latest: (cb) ->
     redis.zrange [@key(), -1, -1, "WITHSCORES"], (err, res) ->
       return cb(err) if err
       return cb(null, new Comic("http://s3.amazonaws.com/ayp/db.jpg", 0)) unless res.length > 0
-      return cb(null, new Comic(res[0], res[1], saved: true))+      return Comic.at(res[1], cb) # We piggy-back on `Comic.at` to DRY the fetch->update->callback path

class Comic
  @prefix: AYP_PREFIX

  @key: () -> "#{@prefix}:comics"
  key: -> @constructor.key()

  constructor: (@url, @time, options={}) ->
    @saved = options.saved ? false

  save: (cb=(->)) ->
    return cb("already saved") if @saved
    @saved = true
    redis.zadd [@key(), @time, @url], (err, res) ->
      cb(err, this)

  # Return a comic stamped at `stamp` to caller by
  # invoking callback as `cb(err, Comic)` if it is found.


  Comic.at stamp, (err, comic) ->
    return failHome() if err
    response.render 'strip', comic: comic

app.post "/new/", (req, res) ->
