             uuid   : required  # uuid=sha1-based uuid coming from blob
             bucket : BLOB_GCLOUD_BUCKET # name of bucket
             force  : false     # if true, upload even if already uploaded
-            cb     : required  # cb(err)
+            cb     : undefined  # cb(err)
         x = undefined
         async.series([
             (cb) =>


    get_blob: (opts) =>
        opts = defaults opts,
            uuid : required
            cb   : required
        @table('blobs').get(opts.uuid).run (err, x) =>
            if err
                opts.cb(err)
            else
                if not x
                    opts.cb(undefined, undefined)
                else if x.expire and x.expire <= new Date()
                    opts.cb(undefined, undefined)   # no such blob anymore
                    @table('blobs').get(opts.uuid).delete().run()   # delete it
                else
                    opts.cb(undefined, x.blob)
                    # We now also update the access counter/times for the blob, but of course
                    # don't block on opts.cb above to do this.
                    @touch_blob(uuid : opts.uuid)

    # Return gcloud API interface
    gcloud: () =>

            cb    : required   # cb(err)
        @table('blobs').getAll(opts.uuids...).replace(
            @r.row.without(expire:true)).run(opts.cb)

    # If blob has been backed up offsite
    #close_blob: (opts) =>
    #    opts = defaults opts,
    #        uuid : required   # uuid=sha1-based from blob
    #        cb   : required   # cb(err)
    #        @r.row.without(expire:true)).run(opts.cb)

    ###
    # User queries
