Package org.apache.tapestry5.plastic

## Interface PlasticClass

- All Superinterfaces:
    `AnnotationAccess`
  All Known Implementing Classes:
    `PlasticClassImpl`

      public interface PlasticClass
      extends AnnotationAccess

  The representation of a class while it is being instrumented and transformed. PlasticClass allows for an imperative style of development: the PlasticClass is provided to other objects; they can query it for relevant fields or methods, and invoke methods that modify the class in various ways. Ultimately, the end result is a `ClassInstantiator` used to create instances of the fully instrumented and transformed class. The terminology is that a class that is being transformed is "plastic", but the end result is a normal concrete class (albeit in a different class loader). Implements `AnnotationAccess` to provide access to annotations on the type itself. This class is expressly not thread safe; only a single thread should be responsible for operating on a PlasticClass. TODO: what about annotation inheritance?

- - ### Method Summary

    All Methods Instance Methods Abstract Methods
    Modifier and Type | Method | Description
    --- | --- | ---
    `PlasticClass` | `addToString​(java.lang.String toStringValue)` | Conditionally adds an implementation of `toString()` to the class, but only if it is not already present in the class, or in a (transformed) super-class.
    `java.util.List<PlasticField>` | `getAllFields()` | Returns all non-introduced fields, in sorted order by name.
    `java.lang.String` | `getClassName()` | Returns the fully qualified class name of the class being transformed.
    `<T extends java.lang.annotation.Annotation> java.util.List<PlasticField>` | `getFieldsWithAnnotation​(java.lang.Class<T> annotationType)` | Matches all fields (claimed or not) that have the given annotation.
    `java.util.List<PlasticMethod>` | `getMethods()` | Returns all methods of the class, in sorted order.
    `<T extends java.lang.annotation.Annotation> java.util.List<PlasticMethod>` | `getMethodsWithAnnotation​(java.lang.Class<T> annotationType)` | Matches methods with the given annotation.
    `java.lang.String` | `getSuperClassName()` | Returns the name of the super-class of the class being transformed.
    `java.util.List<PlasticField>` | `getUnclaimedFields()` | Returns all unclaimed fields, in sorted order by name.
    `PlasticField` | `introduceField​(java.lang.Class fieldType, java.lang.String suggestedName)` | Convenience method that uses a Java class rather than a type name.
    `PlasticField` | `introduceField​(java.lang.String typeName, java.lang.String suggestedName)` | Introduces a new private field into the class.
    `java.util.Set<PlasticMethod>` | `introduceInterface​(java.lang.Class interfaceType)` | Introduces each method defined by the interface into the class.
    `PlasticMethod` | `introduceMethod​(java.lang.reflect.Method method)` | A convenience that creates a `MethodDescription` from the Method and introduces that.
    `PlasticMethod` | `introduceMethod​(MethodDescription description)` | Returns an existing method declared in this class, or introduces a new method into this class.
    `PlasticMethod` | `introduceMethod​(MethodDescription description, InstructionBuilderCallback callback)` | Returns an existing method declared in this class, or introduces a new method into this class.
    `PlasticMethod` | `introducePrivateMethod​(java.lang.String typeName, java.lang.String suggestedName, java.lang.String[] argumentTypes, java.lang.String[] exceptionTypes)` | Introduces a new private method into the class, ensuring that the method name is unique.
    `boolean` | `isInterfaceImplemented​(java.lang.Class interfaceType)` | Returns true if this class, or a super-class, implements the indicated interface.
    `boolean` | `isMethodImplemented​(MethodDescription description)` | Returns true if this class has an implementation of the indicated method, or a super-class provides a non-abstract implementation.
    `PlasticClass` | `onConstruct​(ConstructorCallback callback)` | Adds the callback for execution when an instance of the class is instantiated.
    `PlasticClass` | `proxyInterface​(java.lang.Class interfaceType, PlasticField field)` | Introduces the interface, and then invokes `PlasticMethod.delegateTo(PlasticField)` on each method defined by the interface.
    `PlasticClass` | `proxyInterface​(java.lang.Class interfaceType, PlasticMethod method)` | Introduces the interface, and then invokes `PlasticMethod.delegateTo(PlasticMethod)` on each method defined by the interface.

    - ### Methods inherited from interface org.apache.tapestry5.plastic.AnnotationAccess

      `getAnnotation, hasAnnotation`

- - ### Method Detail

    - #### getClassName

          java.lang.String getClassName()

      Returns the fully qualified class name of the class being transformed.

    - #### getFieldsWithAnnotation

          <T extends java.lang.annotation.Annotation> java.util.List<PlasticField> getFieldsWithAnnotation​(java.lang.Class<T> annotationType)

      Matches all fields (claimed or not) that have the given annotation. Returns the fields in sorted order.
      Returns:
        Unmodifiable List of fields.

    - #### getAllFields

          java.util.List<PlasticField> getAllFields()

      Returns all non-introduced fields, in sorted order by name.
      Returns:
        Unmodifiable list of fields.

    - #### getUnclaimedFields

          java.util.List<PlasticField> getUnclaimedFields()

      Returns all unclaimed fields, in sorted order by name. This does not include introduced fields.
      Returns:
        Unmodifiable list of fields.
      See Also:
        `PlasticField.claim(Object)`

    - #### introduceField

          PlasticField introduceField​(java.lang.String typeName,
                                      java.lang.String suggestedName)

      Introduces a new private field into the class.
      Parameters:
        `typeName` - the Java class name for the field, or (possibly) a primitive type name or an array
        `suggestedName` - the suggested name for the field, which may be modified to ensure that the field name is unique
      Returns:
        PlasticField for the introduced field

    - #### introduceField

          PlasticField introduceField​(java.lang.Class fieldType,
                                      java.lang.String suggestedName)

      Convenience method that uses a Java class rather than a type name.

    - #### introducePrivateMethod

          PlasticMethod introducePrivateMethod​(java.lang.String typeName,
                                               java.lang.String suggestedName,
                                               java.lang.String[] argumentTypes,
                                               java.lang.String[] exceptionTypes)

      Introduces a new private method into the class, ensuring that the method name is unique.
      Parameters:
        `typeName` - return type of method
        `suggestedName` - suggested name for the method; the actual method name may be modified to ensure uniqueness
        `argumentTypes` - types of any arguments (may be null)
        `exceptionTypes` - type of any checked exceptions (may be null)
      Returns:
        new method, with default implementation

    - #### getMethodsWithAnnotation

          <T extends java.lang.annotation.Annotation> java.util.List<PlasticMethod> getMethodsWithAnnotation​(java.lang.Class<T> annotationType)

      Matches methods with the given annotation.
      Returns:
        Unmodifiable list of methods, in sorted order.

    - #### getMethods

          java.util.List<PlasticMethod> getMethods()

      Returns all methods of the class, in sorted order. This does not include static methods, or any introduced methods.
      Returns:
        Unmodifiable list of methods.

    - #### introduceMethod

          PlasticMethod introduceMethod​(MethodDescription description)

      Returns an existing method declared in this class, or introduces a new method into this class. The method is created with default behavior. If the method overrides a non-private, non-abstract method implemented in a transformed super class, the the default behavior is to invoke that method and return its value. Otherwise, the default behavior is to ignore parameters and return 0, false, or null. Void methods will invoke the super-class implementation (if it exists) and return no value. It is allowed for the method description to indicate an abstract method; however the abstract flag will be removed, and a non-abstract method will be created.
      Parameters:
        `description` - describes the method name, visibility, return value, etc.
      Returns:
        a new (or previously created) PlasticMethod for the method
      Throws:
        `java.lang.IllegalArgumentException` - if the method is abstract or static

    - #### introduceMethod

          PlasticMethod introduceMethod​(MethodDescription description,
                                        InstructionBuilderCallback callback)

      Returns an existing method declared in this class, or introduces a new method into this class. The method is created with default behavior. It is allowed for the method description to indicate an abstract method; however the abstract flag will be removed, and a non-abstract method will be created.
      Parameters:
        `description` - describes the method name, visibility, return value, etc.
        `callback` - used to create the implementation of the method
      Returns:
        a new (or previously created) PlasticMethod for the method
      Throws:
        `java.lang.IllegalArgumentException` - if the method is abstract or static

    - #### introduceMethod

          PlasticMethod introduceMethod​(java.lang.reflect.Method method)

      A convenience that creates a `MethodDescription` from the Method and introduces that. This is often invoked when walking the methods of an interface and introducing each of those methods. Introduced methods are always concrete, not abstract. The abstract flag on the method modifiers will always be stripped off, which is handy when introducing methods from an interface.
      Parameters:
        `method` - to introduce
      Returns:
        new (or previously created) PlasticMethod

    - #### introduceInterface

          java.util.Set<PlasticMethod> introduceInterface​(java.lang.Class interfaceType)

      Introduces each method defined by the interface into the class. Determines which new methods must be introduced in order to ensure that all methods of the interface are implemented. The newly introduced methods, if any, are returned.

    - #### proxyInterface

          PlasticClass proxyInterface​(java.lang.Class interfaceType,
                                      PlasticField field)

      Introduces the interface, and then invokes `PlasticMethod.delegateTo(PlasticField)` on each method defined by the interface.
      Parameters:
        `interfaceType` - defines the interface to proxy
        `field` - field containing an object to delegate to
      Returns:
        this plastic class, for further configuration

    - #### proxyInterface

          PlasticClass proxyInterface​(java.lang.Class interfaceType,
                                      PlasticMethod method)

      Introduces the interface, and then invokes `PlasticMethod.delegateTo(PlasticMethod)` on each method defined by the interface.
      Parameters:
        `interfaceType` - defines the interface to proxy
        `method` - method to delegate to
      Returns:
        this plastic class, for further configuration
      Since:
        5.4.4

    - #### addToString

          PlasticClass addToString​(java.lang.String toStringValue)

      Conditionally adds an implementation of `toString()` to the class, but only if it is not already present in the class, or in a (transformed) super-class.
      Parameters:
        `toStringValue` - the fixed value to be returned from invoking toString()
      Returns:
        this plastic class, for further configuration

    - #### isMethodImplemented

          boolean isMethodImplemented​(MethodDescription description)

      Returns true if this class has an implementation of the indicated method, or a super-class provides a non-abstract implementation.

    - #### isInterfaceImplemented

          boolean isInterfaceImplemented​(java.lang.Class interfaceType)

      Returns true if this class, or a super-class, implements the indicated interface.
      Parameters:
        `interfaceType` -
      Returns:
        true if the interface is implemented

    - #### getSuperClassName

          java.lang.String getSuperClassName()

      Returns the name of the super-class of the class being transformed.

    - #### onConstruct

          PlasticClass onConstruct​(ConstructorCallback callback)

      Adds the callback for execution when an instance of the class is instantiated.
      Parameters:
        `callback` - to execute at instance construction time