docs: public ValueExpression getValueExpression(FaceletContext ctx, Class type)
      {
          AbstractFaceletContext actx = (AbstractFaceletContext) ctx;
          
          //volatile reads are atomic, so take the tuple to later comparison.
          Object[] localCachedExpression = cachedExpression;
          if (actx.isAllowCacheELExpressions() && localCachedExpression != null && localCachedExpression.length == 2)
          {
              //If the expected type is the same return the cached one
              if (localCachedExpression[0] == null && type == null)
              {
                  // If #{cc} recalculate the composite component level
                  if ((this.capabilities & EL_CC) != 0)
                  {
                      return ((LocationValueExpression)localCachedExpression[1]).apply(
                              actx.getFaceletCompositionContext().getCompositeComponentLevel());
                  }
                  return (ValueExpression) localCachedExpression[1];
              }
              else if (localCachedExpression[0] != null && localCachedExpression[0].equals(type))
              {
                  // If #{cc} recalculate the composite component level
                  if ((this.capabilities & EL_CC) != 0)
                  {
                      return ((LocationValueExpression)localCachedExpression[1]).apply(
                              actx.getFaceletCompositionContext().getCompositeComponentLevel());
                  }
                  return (ValueExpression) localCachedExpression[1];
              }
          }
  
          actx.beforeConstructELExpression();
          try
          {
              ExpressionFactory f = ctx.getExpressionFactory();
              ValueExpression valueExpression = f.createValueExpression(ctx, this.value, type);
              
              if (ExternalSpecifications.isUnifiedELAvailable())
              {
                  if (actx.getFaceletCompositionContext().isWrapTagExceptionsAsContextAware())
                  {
                      valueExpression = new ContextAwareTagValueExpressionUEL(this, valueExpression);
                  }
                  else
                  {
                      valueExpression = new TagValueExpressionUEL(this, valueExpression);
                  }
              }
              else
              {
                  if (actx.getFaceletCompositionContext().isWrapTagExceptionsAsContextAware())
                  {
                      valueExpression = new ContextAwareTagValueExpression(this, valueExpression);
                  }
                  else
                  {
                      valueExpression = new TagValueExpression(this, valueExpression);
                  }
              }
  
              // if the ValueExpression contains a reference to the current composite
              // component, the Location also has to be stored in the ValueExpression 
              // to be able to resolve the right composite component (the one that was
              // created from the file the Location is pointing to) later.
              // (see MYFACES-2561 for details)
              if ((this.capabilities & EL_CC) != 0)
              {
                  if (ExternalSpecifications.isUnifiedELAvailable())
                  {
                      valueExpression = new LocationValueExpressionUEL(getLocation(), valueExpression, 
                              actx.getFaceletCompositionContext().getCompositeComponentLevel());
                  }
                  else
                  {
                      valueExpression = new LocationValueExpression(getLocation(), valueExpression, 
                              actx.getFaceletCompositionContext().getCompositeComponentLevel());
                  }
              }
              else if ((this.capabilities & EL_RESOURCE) != 0)
              {
                  if (ExternalSpecifications.isUnifiedELAvailable())
                  {
                      valueExpression = new ResourceLocationValueExpressionUEL(getLocation(), valueExpression);
                  }
                  else
                  {
                      valueExpression = new ResourceLocationValueExpression(getLocation(), valueExpression);
                  }
              }
              
              
              if (actx.isAllowCacheELExpressions() && !actx.isAnyFaceletsVariableResolved())
              {
                  cachedExpression = new Object[]{type, valueExpression};
              }
              return valueExpression;
          }
          catch (Exception e)
          {
              throw new TagAttributeException(this, e);
          }
          finally
          {
              actx.afterConstructELExpression();
          }
      }