<?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">

    <parameters>
        <parameter key="api.mapping.cache.prefix" />
    </parameters>

    <services>
        <!-- Factories -->

        <service id="api.mapping.class_metadata_factory" class="Dunglas\ApiBundle\Mapping\Factory\ClassMetadataFactory">
            <argument type="service" id="api.mapping.loaders.chain" />
        </service>

        <service id="api.mapping.attribute_metadata_factory" class="Dunglas\ApiBundle\Mapping\Factory\AttributeMetadataFactory" public="false">
            <argument type="service" id="api.property_info" />
            <argument type="service" id="api.resource_collection" />
        </service>

        <!-- Cache -->

        <service id="api.cache_warmer.metadata" class="Dunglas\ApiBundle\CacheWarmer\MetadataCacheWarmer" public="false">
            <argument type="service" id="api.resource_collection" />
            <argument type="service" id="api.mapping.class_metadata_factory" />

            <tag name="kernel.cache_warmer" priority="0" />
        </service>

        <service id="api.mapping.cache.apc" class="Doctrine\Common\Cache\ApcCache" public="false">
            <call method="setNamespace">
                <argument>%api.mapping.cache.prefix%</argument>
            </call>
        </service>

        <!-- Loaders -->

        <service id="api.mapping.loaders.chain" class="Dunglas\ApiBundle\Mapping\Loader\LoaderChain" public="false">
            <argument type="collection">
                <argument type="service" id="api.mapping.loaders.serializer_metadata" />
                <argument type="service" id="api.mapping.loaders.reflection" />
                <argument type="service" id="api.mapping.loaders.validator_metadata" />
                <argument type="service" id="api.mapping.loaders.phpdoc" />
                <argument type="service" id="api.doctrine.mapping.loaders.identifier" on-invalid="ignore" />
                <argument type="service" id="api.mapping.loaders.annotation" />
            </argument>
        </service>

        <service id="api.mapping.loaders.serializer_metadata" class="Dunglas\ApiBundle\Mapping\Loader\SerializerMetadataLoader" public="false">
            <argument type="service" id="api.mapping.attribute_metadata_factory" />
            <argument type="service" id="serializer.mapping.class_metadata_factory" />
        </service>

        <service id="api.mapping.loaders.reflection" class="Dunglas\ApiBundle\Mapping\Loader\ReflectionLoader" public="false">
            <argument type="service" id="api.mapping.attribute_metadata_factory" />
        </service>

        <service id="api.mapping.loaders.validator_metadata" class="Dunglas\ApiBundle\Mapping\Loader\ValidatorMetadataLoader" public="false">
            <argument type="service" id="validator" />
        </service>

        <service id="api.mapping.loaders.phpdoc" class="Dunglas\ApiBundle\Mapping\Loader\PhpDocLoader" public="false">
            <argument type="service" id="api.property_info" />
        </service>

        <service id="api.mapping.loaders.annotation" class="Dunglas\ApiBundle\Mapping\Loader\AnnotationLoader" public="false">
            <argument type="service" id="annotations.reader" />
        </service>
    </services>

</container>
