org.gradle.api

## Interface NamedDomainObjectContainer<T>

- Type Parameters:
    `T` - The type of domain objects in this container.
  All Superinterfaces:
    Collection<T>, org.gradle.util.Configurable<NamedDomainObjectContainer<T>>, DomainObjectCollection<T>, Iterable<T>, NamedDomainObjectCollection<T>, NamedDomainObjectSet<T>, Set<T>
  All Known Subinterfaces:
    AuthenticationContainer, BuildTypeContainer, ConfigurationContainer, DistributionContainer, ExtensiblePolymorphicDomainObjectContainer<T>, FlavorContainer, IvyConfigurationContainer, NativeToolChainRegistry, PlatformContainer, PlayDistributionContainer, PolymorphicDomainObjectContainer<T>, PublicationContainer, Repositories, SourceSetContainer, TaskContainer

      public interface NamedDomainObjectContainer<T>
      extends NamedDomainObjectSet<T>, org.gradle.util.Configurable<NamedDomainObjectContainer<T>>

  A named domain object container is a specialisation of `NamedDomainObjectSet` that adds the ability to create instances of the element type.

  Implementations may use different strategies for creating new object instances.

  Note that a container is an implementation of `SortedSet`, which means that the container is guaranteed to only contain elements with unique names within this container. Furthermore, items are ordered by their name.

  See Also:
    `NamedDomainObjectSet`

- - ### Method Summary

    Methods
    Modifier and Type | Method and Description
    --- | ---
    `NamedDomainObjectContainer<T>` | `configure(Closure configureClosure)` Allows the container to be configured, creating missing objects as they are referenced.
    `T` | `create(String name)` Creates a new item with the given name, adding it to this container.
    `T` | `create(String name, Action<? super T> configureAction)` Creates a new item with the given name, adding it to this container, then configuring it with the given action.
    `T` | `create(String name, Closure configureClosure)` Creates a new item with the given name, adding it to this container, then configuring it with the given closure.
    `T` | `maybeCreate(String name)` Looks for an item with the given name, creating and adding it to this container if it does not exist.

    - ### Methods inherited from interface org.gradle.api.NamedDomainObjectSet

      `findAll, matching, matching, withType`

    - ### Methods inherited from interface org.gradle.api.NamedDomainObjectCollection

      `add, addAll, addRule, addRule, findByName, getAsMap, getAt, getByName, getByName, getByName, getNamer, getNames, getRules`

    - ### Methods inherited from interface org.gradle.api.DomainObjectCollection

      `all, all, whenObjectAdded, whenObjectAdded, whenObjectRemoved, whenObjectRemoved, withType, withType`

    - ### Methods inherited from interface java.util.Collection

      `clear, contains, containsAll, equals, hashCode, isEmpty, iterator, remove, removeAll, retainAll, size, toArray, toArray`

    - ### Methods inherited from interface java.util.Set

      `add, addAll, clear, contains, containsAll, equals, hashCode, isEmpty, iterator, remove, removeAll, retainAll, size, toArray, toArray`

- - ### Method Detail

    - #### create

          T create(String name)
                   throws InvalidUserDataException

      Creates a new item with the given name, adding it to this container.
      Parameters:
        `name` - The name to assign to the created object
      Returns:
        The created object. Never null.
      Throws:
        `InvalidUserDataException` - if an object with the given name already exists in this container.

    - #### maybeCreate

          T maybeCreate(String name)

      Looks for an item with the given name, creating and adding it to this container if it does not exist.
      Parameters:
        `name` - The name to find or assign to the created object
      Returns:
        The found or created object. Never null.

    - #### create

          T create(String name,
                 Closure configureClosure)
                   throws InvalidUserDataException

      Creates a new item with the given name, adding it to this container, then configuring it with the given closure.
      Parameters:
        `name` - The name to assign to the created object
        `configureClosure` - The closure to configure the created object with
      Returns:
        The created object. Never null.
      Throws:
        `InvalidUserDataException` - if an object with the given name already exists in this container.

    - #### create

          T create(String name,
                 Action<? super T> configureAction)
                   throws InvalidUserDataException

      Creates a new item with the given name, adding it to this container, then configuring it with the given action.
      Parameters:
        `name` - The name to assign to the created object
        `configureAction` - The action to configure the created object with
      Returns:
        The created object. Never null.
      Throws:
        `InvalidUserDataException` - if an object with the given name already exists in this container.

    - #### configure

          NamedDomainObjectContainer<T> configure(Closure configureClosure)

      Allows the container to be configured, creating missing objects as they are referenced.

      TODO: example usage

      Specified by:
        `configure` in interface `org.gradle.util.Configurable<NamedDomainObjectContainer<T>>`
      Parameters:
        `configureClosure` - The closure to configure this container with
      Returns:
        This.