<?xml version="1.0" ?>

<container xmlns="http://symfony.com/schema/dic/services"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">

    <services>
        <service id="api_platform.metadata.property.metadata_factory" alias="api_platform.metadata.property.metadata_factory.xml" />
        <service id="ApiPlatform\Metadata\Property\Factory\PropertyMetadataFactoryInterface" alias="api_platform.metadata.property.metadata_factory" />
        <!-- The PropertyInfo decorator must always be the first decorator, it will create the metadata if it doesn't exist -->
        <service id="api_platform.metadata.property.metadata_factory.property_info" class="ApiPlatform\Metadata\Property\Factory\PropertyInfoPropertyMetadataFactory" decorates="api_platform.metadata.property.metadata_factory" decoration-priority="40" public="false">
            <argument type="service" id="api_platform.property_info" />
            <argument type="service" id="api_platform.metadata.property.metadata_factory.property_info.inner" />
        </service>

        <service id="api_platform.metadata.property.metadata_factory.attribute" decorates="api_platform.metadata.property.metadata_factory" decoration-priority="20" class="ApiPlatform\Metadata\Property\Factory\AttributePropertyMetadataFactory" public="false">
            <argument type="service" id="api_platform.metadata.property.metadata_factory.attribute.inner" />
        </service>

        <service id="api_platform.metadata.property.metadata_factory.serializer" class="ApiPlatform\Metadata\Property\Factory\SerializerPropertyMetadataFactory" decorates="api_platform.metadata.property.metadata_factory" decoration-priority="30" public="false">
            <argument type="service" id="serializer.mapping.class_metadata_factory" />
            <argument type="service" id="api_platform.metadata.property.metadata_factory.serializer.inner" />
            <argument type="service" id="api_platform.resource_class_resolver" />
        </service>

        <service id="api_platform.metadata.property.metadata_factory.cached" class="ApiPlatform\Metadata\Property\Factory\CachedPropertyMetadataFactory" decorates="api_platform.metadata.property.metadata_factory" decoration-priority="-10" public="false">
            <argument type="service" id="api_platform.cache.metadata.property" />
            <argument type="service" id="api_platform.metadata.property.metadata_factory.cached.inner" />
        </service>

        <service id="api_platform.metadata.property.metadata_factory.default_property" decorates="api_platform.metadata.property.metadata_factory" decoration-priority="30" class="ApiPlatform\Metadata\Property\Factory\DefaultPropertyMetadataFactory" public="false">
            <argument type="service" id="api_platform.metadata.property.metadata_factory.default_property.inner" />
        </service>

        <service id="api_platform.metadata.property.metadata_factory.identifier" decorates="api_platform.metadata.property.metadata_factory" decoration-priority="30" class="ApiPlatform\Metadata\Property\Factory\IdentifierPropertyMetadataFactory" public="false">
            <argument type="service" id="api_platform.resource_class_resolver" />
            <argument type="service" id="api_platform.metadata.property.metadata_factory.identifier.inner" />
        </service>

        <!-- XML -->
        <service id="api_platform.metadata.property.metadata_factory.xml" class="ApiPlatform\Metadata\Property\Factory\ExtractorPropertyMetadataFactory" public="false">
            <argument type="service" id="api_platform.metadata.property_extractor.xml" />
        </service>

        <!-- Cache -->
        <service id="api_platform.cache.metadata.property" parent="cache.system" public="false">
            <tag name="cache.pool" />
        </service>
    </services>
</container>
