code: function Frame(callback, tasks) {
  
          /**
           * Returns whether this frame is ready to be rendered. This function
           * returns true if and only if ALL underlying tasks are unblocked.
           * 
           * @returns {Boolean} true if all underlying tasks are unblocked,
           *                    false otherwise.
           */
          this.isReady = function() {
  
              // Search for blocked tasks
              for (var i=0; i < tasks.length; i++) {
                  if (tasks[i].blocked)
                      return false;
              }
  
              // If no blocked tasks, the frame is ready
              return true;
  
          };
  
          /**
           * Renders this frame, calling the associated callback, if any, after
           * the frame is complete. This function MUST only be called when no
           * blocked tasks exist. Calling this function with blocked tasks
           * will result in undefined behavior.
           */
          this.flush = function() {
  
              // Draw all pending tasks.
              for (var i=0; i < tasks.length; i++)
                  tasks[i].execute();
  
              // Call callback
              if (callback) callback();
  
          };
  
      }
docs: An ordered list of tasks which must be executed atomically. Once
  executed, an associated (and optional) callback will be called.
  
  @private
  @constructor
  @param {function} callback The function to call when this frame is
  rendered.
  @param {Task[]} tasks The set of tasks which must be executed to render
  this frame.