/** @see javax.el.ELResolver#getValue(ELContext, Object, Object) */
  @Override
  public Object getValue(ELContext context, Object base, Object property) {
    if (property != null) {
      String propertyString = property.toString();
      Namespace namespace = null;
      if (base == null) {
        if (manager.getRootNamespace().contains(propertyString)) {
          context.setPropertyResolved(true);
          return manager.getRootNamespace().get(propertyString);
        }
      } else if (base instanceof Namespace) {
        namespace = (Namespace) base;
        // We're definitely the responsible party
        context.setPropertyResolved(true);
        if (namespace.contains(propertyString)) {
          // There is a child namespace
          return namespace.get(propertyString);
        }
      } else {
        // let the standard EL resolver chain handle the property
        return null;
      }
      final String name;
      if (namespace != null) {
        // Try looking in the manager for a bean
        name = namespace.qualifyName(propertyString);
      } else {
        name = propertyString;
      }
      Object value = null;
      try {

        Bean<?> bean = manager.resolve(manager.getBeans(name));
        CreationalContext<?> creationalContext = manager.createCreationalContext(bean);
        if (bean != null) {
          value = manager.getReference(bean, creationalContext);
        }
        creationalContext.release();
      } catch (Exception e) {
        throw new RuntimeException(
            "Error resolving property " + propertyString + " against base " + base, e);
      }
      if (value != null) {
        context.setPropertyResolved(true);
        return value;
      }
    }
    return null;
  }