/**
   * @param attr
   * @return
   */
  public String getAttributeValue(String attr) {
    Object object = attributes.get(attr);
    if (isNull(object)) return null;

    Object value = CoffeeBinder.getValue(object.toString(), getCoffeeContext());
    if (isNull(value)) return "";

    return value.toString();
  }
  @Override
  public void bind() {
    configure();

    if (!isValueHolder()) return;

    String expression = (String) getHeldValue();
    String value = coffeeContext.getRequest().getParameter(getId());
    CoffeeBinder.setValue(expression, coffeeContext, value);
  }
 @Override
 /**
  * Retrieves the attribute value from component as Object.<br>
  * <br>
  * If the component implementation has a setter method with same name of the attribute it will be
  * dispatched and ignoring the value binding. Otherwise, it will try to retrieve the value from a
  * possible defined binding expression.
  *
  * @param attribute
  */
 public Object getAttribute(String attribute) {
   try {
     if (isInvalidAttribute(attribute)) return getAttributeValue(attribute);
     Method getter = Reflection.extractGetterFor(attribute, this);
     return getter.invoke(this);
   } catch (Exception e) {
     Object object = attributes.get(attribute);
     if (isNull(object)) return null;
     return CoffeeBinder.getValue(object.toString(), getCoffeeContext());
   }
 }
 public String getTextContent() {
   if (isNull(textContent)) return null;
   return CoffeeBinder.getValue(textContent, coffeeContext).toString();
 }