# ExtensionAware

API Documentation: | `ExtensionAware`

Known Subtypes: |
`Project`
`Task`

Objects that can be extended at runtime with other objects.

    // Extensions are just plain objects, there is no interface/type
    class MyExtension {
      String foo

      MyExtension(String foo) {
        this.foo = foo
      }
    }

    // Add new extensions via the extension container
    project.extensions.create('custom', MyExtension, "bar")
    //                       («name»,   «type»,       «constructor args», …)

    // extensions appear as properties on the target object by the given name
    assert project.custom instanceof MyExtension
    assert project.custom.foo == "bar"

    // also via a namespace method
    project.custom {
      assert foo == "bar"
      foo = "other"
    }
    assert project.custom.foo == "other"

    // Extensions added with the extension container's create method are themselves extensible
    assert project.custom instanceof ExtensionAware
    project.custom.extensions.create("nested", MyExtension, "baz")
    assert project.custom.nested.foo == "baz"

    // All extension aware objects have a special “ext” extension of type ExtraPropertiesExtension
    assert project.hasProperty("myProperty") == false
    project.ext.myProperty = "myValue"

    // Properties added to the “ext” extension are promoted to the owning object
    assert project.myProperty == "myValue"

Many Gradle objects are extension aware. This includes; projects, tasks, configurations, dependencies etc.

For more on adding & creating extensions, see `ExtensionContainer`.

For more on extra properties, see `ExtraPropertiesExtension`.

### Properties

Property | Description
`extensions` | The container of extensions.

### Methods

No methods

### Script blocks

No script blocks

### Property details

#### `ExtensionContainer` `extensions` (read-only)

The container of extensions.