MethodAppearanceFineTuner (FreeMarker 2.3.23 API)
Date: 2015-07-05

freemarker.ext.beans

## Interface MethodAppearanceFineTuner

-     public interface MethodAppearanceFineTuner

  Used for customizing how the methods are visible from templates, via `BeansWrapper.setMethodAppearanceFineTuner(MethodAppearanceFineTuner)`. The object that implements this should also implement `SingletonCustomizer` whenever possible.
  Since:
    2.3.21

- - ### Method Summary

    All Methods Instance Methods Abstract Methods
    Modifier and Type | Method and Description
    --- | ---
    `void` | `process(BeansWrapper.MethodAppearanceDecisionInput in, BeansWrapper.MethodAppearanceDecision out)` Experimental method; subject to change! Implement this to tweak certain aspects of how methods appear in the data-model.

- - ### Method Detail

    - #### process

          void process(BeansWrapper.MethodAppearanceDecisionInput in,
                       BeansWrapper.MethodAppearanceDecision out)

      Experimental method; subject to change! Implement this to tweak certain aspects of how methods appear in the data-model. `BeansWrapper` will pass in all Java methods here that it intends to expose in the data-model as methods (so you can do `obj.foo()` in the template). With this method it you can do the following tweaks:
      - Hide a method that would be otherwise shown by calling `BeansWrapper.MethodAppearanceDecision.setExposeMethodAs(String)` with `null` parameter. Note that you can't un-hide methods that are not public or are considered to by unsafe (like `Object.wait()`) because `process(freemarker.ext.beans.BeansWrapper.MethodAppearanceDecisionInput, freemarker.ext.beans.BeansWrapper.MethodAppearanceDecision)` is not called for those.
      - Show the method with a different name in the data-model than its real name by calling `BeansWrapper.MethodAppearanceDecision.setExposeMethodAs(String)` with non-`null` parameter.
      - Create a fake JavaBean property for this method by calling `BeansWrapper.MethodAppearanceDecision.setExposeAsProperty(PropertyDescriptor)`. For example, if you have `int size()` in a class, but you want it to be accessed from the templates as `obj.size`, rather than as `obj.size()`, you can do that with this. The default is `null`, which means that no fake property is created for the method. You need not and shouldn't set this to non-`null` for the getter methods of real JavaBean properties, as those are automatically shown as properties anyway. The property name in the `PropertyDescriptor` can be anything, but the method (or methods) in it must belong to the class that is given as the `clazz` parameter or it must be inherited from that class, or else whatever errors can occur later. `IndexedPropertyDescriptor`-s are supported. If a real JavaBean property of the same name exists, it won't be replaced by the fake one. Also if a fake property of the same name was assigned earlier, it won't be replaced.
      - Prevent the method to hide a JavaBean property (fake or real) of the same name by calling `BeansWrapper.MethodAppearanceDecision.setMethodShadowsProperty(boolean)` with `false`. The default is `true`, so if you have both a property and a method called "foo", then in the template `myObject.foo` will return the method itself instead of the property value, which is often undesirable.

      Note that you can expose a Java method both as a method and as a JavaBean property on the same time, however you have to chose different names for them to prevent shadowing.

      Parameters:
        `in` - Describes the method about which the decision will have to be made.
        `out` - Stores how the method will be exposed in the data-model after `process(freemarker.ext.beans.BeansWrapper.MethodAppearanceDecisionInput, freemarker.ext.beans.BeansWrapper.MethodAppearanceDecision)` returns. This is initialized so that it reflects the default behavior of `BeansWrapper`, so you don't have to do anything with this when you don't want to change the default behavior.