@Override
  public void registerBridge(WebViewBridge webViewBridge, Object bridgeObject) {
    bridgeObject = mInjectorHelper.inject(mContext, bridgeObject);

    Class<?> clazz = bridgeObject.getClass();
    BridgeObjectConfig config = mConfigCache.getBridgeObjectConfig(clazz);

    if (config == null) {
      Log.d(TAG, "Miss cache bridge config");

      config = createBridgeConfig(bridgeObject);
      mConfigCache.putBridgeObjectConfig(clazz, config);
    } else Log.d(TAG, "Bridge config from cache");

    webViewBridge.addBridgeObjectConfig(bridgeObject, config);
  }
  private DomainConfig createDomainConfig(Class<?> clazz) {
    DomainConfig config = mConfigCache.getDomainConfig(clazz);

    if (config == null) {
      Domain domainAnn = (Domain) clazz.getAnnotation(Domain.class);
      if (domainAnn == null)
        throw new InvalidConfigurationRuntimeException("Must be defined as access domain");

      config = new DomainConfig(domainAnn.value());
    } else Log.d(TAG, "Domain config from cache");

    return config;
  }
  private LayoutConfig createLayoutConfig(Class<?> clazz) {
    LayoutConfig config = mConfigCache.getLayoutConfig(clazz);

    if (config == null) {
      Log.d(TAG, "Miss cache layout config");

      Layout layoutAnn = (Layout) clazz.getAnnotation(Layout.class);
      if (layoutAnn == null) {
        throw new InvalidConfigurationRuntimeException("Must be defined as use layout");
      }

      triaina.webview.annotation.WebViewBridgeResouce bridgeAnn =
          (triaina.webview.annotation.WebViewBridgeResouce)
              clazz.getAnnotation(triaina.webview.annotation.WebViewBridgeResouce.class);
      if (bridgeAnn == null)
        throw new InvalidConfigurationRuntimeException("Must be defined as use layout");

      config = new LayoutConfig(layoutAnn.value(), bridgeAnn.value());
      mConfigCache.putLayoutConfig(clazz, config);
    } else Log.d(TAG, "Layout config from cache");

    return config;
  }