public <T> T getInformalParameter(String name, Class<T> type) {
    Binding binding = getBinding(name);

    Object value = binding == null ? null : binding.get();

    return elementResources.coerce(value, type);
  }
 public Type getBoundGenericType(String parameterName) {
   Binding binding = getBinding(parameterName);
   Type genericType;
   if (binding instanceof Binding2) {
     genericType = ((Binding2) binding).getBindingGenericType();
   } else {
     genericType = binding.getBindingType();
   }
   return genericType;
 }
    void write(MarkupWriter writer) {
      Object value = binding.get();

      if (value == null) return;

      if (value instanceof Block) return;

      // If it's already a String, don't use the TypeCoercer (renderInformalParameters is
      // a CPU hotspot, as is TypeCoercer.coerce).

      String valueString =
          value instanceof String ? (String) value : elementResources.coerce(value, String.class);

      writer.attributes(name, valueString);
    }
  public Class getBoundType(String parameterName) {
    Binding binding = getBinding(parameterName);

    return binding == null ? null : binding.getBindingType();
  }
  public <T extends Annotation> T getParameterAnnotation(
      String parameterName, Class<T> annotationType) {
    Binding binding = getBinding(parameterName);

    return binding == null ? null : binding.getAnnotation(annotationType);
  }