anchor.diff:  | `@api:org.gradle.api.tasks.Internal[]`
   | Any type
   | Indicates that the property is used internally but is neither an input nor an output.
  +
  +3+| _* In fact, `File` can be any type accepted by api:org.gradle.api.Project#file(java.lang.Object)[] and `Iterable&lt;File&gt;` can be any type accepted by api:org.gradle.api.Project#files(java.lang.Object...)[]. This includes instances of `Callable`, such as closures, allowing for lazy evaluation of the property values. Be aware that the types `FileCollection` and `FileTree` are `Iterable&lt;File&gt;`s._
  +
  +3+| _** Similar to the above, `File` can be any type accepted by api:org.gradle.api.Project#file(java.lang.Object)[]. The `Map` itself can be wrapped in `Callable`s, such as closures._
  +
   |===
  -
  -
  -[NOTE]
  -====
  -| _\*_ In fact, `File` can be any type accepted by api:org.gradle.api.Project#file(java.lang.Object)[] and `Iterable&lt;File&gt;` can be any type accepted by api:org.gradle.api.Project#files(java.lang.Object...)[]. This includes instances of `Callable`, such as closures, allowing for lazy evaluation of the property values. Be aware that the types `FileCollection` and `FileTree` are `Iterable&lt;File&gt;`s.
  -
  -| _\*\*_ Similar to the above, `File` can be any type accepted by api:org.gradle.api.Project#file(java.lang.Object)[]. The `Map` itself can be wrapped in `Callable`s, such as closures.
  -
  -====
   
   .Additional annotations used to further qualifying property type annotations
   [cols="a,a", options="header"]
  
positive.code: | Annotation
  | Description
  
  | <anchor>[[skip-when-empty]]
  </anchor>`@api:org.gradle.api.tasks.SkipWhenEmpty[]`
  | Used with `@InputFiles` or `@InputDirectory` to tell Gradle to skip the task if the corresponding files or directory are empty, along with all other input files declared with this annotation. Tasks that have been skipped due to all of their input files that were declared with this annotation being empty will result in a distinct “no source” outcome. For example, `NO-SOURCE` will be emitted in the console output.
  
  | `@api:org.gradle.api.tasks.Optional[]`
  
negative.code: There’s plenty to talk about in this example, so let’s work through each of the input and output properties in turn:
  
  * `templateEngine`
  +
  Represents which engine to use when processing the source templates, e.g. FreeMarker, Velocity, etc. You could implement this as a string, but in this case we have gone for a custom enum as it provides greater type information and safety. Since enums implement `Serializable` automatically, we can treat this as a simple value and use the `@Input` annotation, just as we would with a `String` property.
  
  * `sourceFiles`
  +
  The source templates that the task will be processing. Single files and collections of files need their own special annotations. In this case, we’re dealing with a collection of input files and so we use the `@InputFiles` annotation. You’ll see more file-oriented annotations in a table later.
  
  * `templateData`
  +
  For this example, we’re using a custom class to represent the model data. However, it does not implement `Serializable`, so we can’t use the `@Input` annotation. That’s not a problem as the properties within `TemplateData` - a string and a hash map with serializable type parameters - are serializable and can be annotated with `@Input`. We use `@Nested` on `templateData` to let Gradle know that this is a value with nested input properties.
  
  * `outputDir`
  +
  The directory where the generated files go. As with input files, there are several annotations for output files and directories. A property representing a single directory requires `@OutputDirectory`. You’ll learn about the others soon.
  
  These annotated properties mean that Gradle will skip the task if none of the source files, template engine, model data or generated files have changed since the previous time Gradle executed the task. This will often save a significant amount of time. You can learn how Gradle detects <<sec:how_does_it_work,changes later>>.
  