class CombinedProperties implements Map<String, Object> {

    @Override
    public final boolean containsKey(Object key) {
        final ComputedPropertyParameter computedPropertyParameter = new ComputedPropertyParameter((String) key);

        boolean result = false;

        final ComputedProperty computedProperty = computedProperties.get(computedPropertyParameter.getName());

        if (computedProperty != null) {
            if (cachedValues.containsKey(computedPropertyParameter.getCacheId()) || computedProperty.accepts(asset, request, computedPropertyParameter.getName())) {
                result = true;
            }
        }

        if (!result) {
            result = assetProperties.get(computedPropertyParameter.getName()) != null;
        }

        if (!result) {
            result = metaProperties.get(computedPropertyParameter.getName()) != null;
        }

        return result;
    }

    public  CombinedProperties(final List<ComputedProperty> computedProperties,
                              final SlingHttpServletRequest request,
                              final Asset asset);

}