docs: private static Attribute attribute(Data data, TagLibTag tag, ArrayList<String> args, RefBoolean allowDefaultValue) throws TemplateException {
  	Expression value = null;
  
  	// Name
  	StringBuffer sbType = new StringBuffer();
  	RefBoolean dynamic = new RefBooleanImpl(false);
  	boolean isDefaultValue = false;
  	boolean[] parseExpression = new boolean[2];
  	parseExpression[0] = true;
  	parseExpression[1] = false;
  	String name = attributeName(data.srcCode, dynamic, args, tag, sbType, parseExpression, allowDefaultValue.toBooleanValue());
  
  	// mixed in a noname attribute
  	if (StringUtil.isEmpty(name)) {
  	    allowDefaultValue.setValue(false);
  	    TagLibTagAttr attr = tag.getDefaultAttribute();
  	    if (attr == null) throw new TemplateException(data.srcCode, "Invalid Identifier.");
  	    name = attr.getName();
  	    sbType.append(attr.getType());
  	    isDefaultValue = true;
  	}
  
  	comment(data.srcCode, true);
  
  	if (isDefaultValue || data.srcCode.forwardIfCurrent('=')) {
  	    comment(data.srcCode, true);
  	    // Value
  	    value = attributeValue(data, tag, sbType.toString(), parseExpression[0], false, data.factory.createLitString(""));
  	}
  	// default value boolean true
  	else {
  	    TagLibTagAttr attr = tag.getAttribute(name);
  	    if (attr != null) value = attr.getUndefinedValue(data.factory);
  	    else value = tag.getAttributeUndefinedValue(data.factory);
  
  	    if (sbType.toString().length() > 0) {
  		value = data.factory.toExpression(value, sbType.toString());
  	    }
  	}
  	comment(data.srcCode, true);
  
  	return new Attribute(dynamic.toBooleanValue(), name, value, sbType.toString());
      }