@Override
  public <T extends PageObject> T create(
      Class<T> pageClazz, PageObjectModel model, WebElement webElement) {

    try {

      T pageInstance = createInstance(pageClazz);
      initializeModel(pageInstance, model);
      initializeWebElement(pageInstance, webElement);

      initializeOtherPageObjectTypeFields(pageInstance, pageClazz);

      invokePostConstructMethods(pageInstance, pageClazz);
      checkVisibilityOfAnnotatedFields(pageInstance, pageClazz);

      return pageInstance;

    } catch (RuntimeException e) {
      EventSystem.fireEvent(new ExceptionEvent(model.getBrowser(), e));
      throw e;
    }
  }
 /**
  * Fires the given event using the {@linkplain EventSystem#fireEvent(Event)} method and mark this
  * page object as used using {@linkplain Marker#markAsUsed(PageObject)}.
  *
  * @param event the event to fire.
  * @since 0.9.0
  */
 protected final void fireEventAndMarkAsUsed(Event event) {
   EventSystem.fireEvent(event);
   Marker.markAsUsed(this);
   logger.trace(logMessage("fired event: {}"), event);
 }