load(url, brokenUrl) {
    //Try and get the image from the cache, if successful then return the cached image
    const cachedImage = this.images[url];
    if (cachedImage) return cachedImage;

    //Create a new image
    const img = new CachedImage();

    // Need to add to cache here, otherwise final return will spawn different copies of the same image,
    // Also, there will be multiple loads of the same image.
    this.images[url] = img;

    //Subscribe to the event that is raised if the image loads successfully
    img.image.onload = () => {
      // Properly init the cached item and then request a redraw
      this._fixImageCoordinates(img.image);
      img.init();
      this._redrawWithImage(img);
    };

    //Subscribe to the event that is raised if the image fails to load
    img.image.onerror = () => {
      console.error("Could not load image:", url);
      //Try and load the image specified by the brokenUrl using
      this._tryloadBrokenUrl(url, brokenUrl, img);
    };

    //Set the source of the image to the url, this is what actually kicks off the loading of the image
    img.image.src = url;

    //Return the new image
    return img;
  }
@param {string} url          Url of the image
@param {string} brokenUrl    Url of an image to use if the url image is not found
@returns {Image} img          The image object