<?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.serializer" alias="serializer" />

        <service id="api.property_accessor" alias="property_accessor" />

        <service id="api.resource" class="Dunglas\ApiBundle\Api\Resource" public="false" abstract="true" lazy="true" />

        <service id="api.resource_collection" class="Dunglas\ApiBundle\Api\ResourceCollection" lazy="true" />

        <service id="api.data_provider" class="Dunglas\ApiBundle\Model\DataProviderChain" lazy="true" />

        <service id="api.operation_factory" class="Dunglas\ApiBundle\Api\Operation\OperationFactory" public="false" />

        <service id="api.route_loader" class="Dunglas\ApiBundle\Routing\ApiLoader" public="false">
            <argument type="service" id="api.resource_collection" />
            <argument type="service" id="kernel" />

            <tag name="routing.loader" />
        </service>

        <service id="api.router" class="Dunglas\ApiBundle\Routing\Router" public="false">
            <argument type="service" id="router" />
        </service>

        <service id="api.iri_converter" class="Dunglas\ApiBundle\Api\IriConverter" public="false">
            <argument type="service" id="api.resource_collection" />
            <argument type="service" id="api.data_provider" />
            <argument type="service" id="api.mapping.class_metadata_factory" />
            <argument type="service" id="api.router" />
            <argument type="service" id="api.property_accessor" />
        </service>

        <service id="api.format_negotiator" class="Negotiation\FormatNegotiator" public="false" />

        <!-- Event listeners -->

        <service id="api.listener.request.resource_type" class="Dunglas\ApiBundle\EventListener\ResourceTypeRequestListener">
            <argument type="service" id="api.resource_collection" />

            <tag name="kernel.event_listener" event="kernel.request" method="onKernelRequest" />
        </service>

        <service id="api.listener.request.format" class="Dunglas\ApiBundle\EventListener\FormatRequestListener">
            <argument type="service" id="api.format_negotiator" />
            <argument>%api.supported_formats%</argument>

            <tag name="kernel.event_listener" event="kernel.request" method="onKernelRequest" />
        </service>

        <service id="api.listener.view.validation" class="Dunglas\ApiBundle\EventListener\ValidationViewListener">
            <argument type="service" id="validator" />

            <tag name="kernel.event_listener" event="kernel.view" method="onKernelView" priority="20" />
        </service>

        <!-- Action -->

        <service id="api.action.get_collection" class="Dunglas\ApiBundle\Action\GetCollectionAction">
            <argument type="service" id="api.data_provider" />
        </service>

        <service id="api.action.post_collection" class="Dunglas\ApiBundle\Action\PostCollectionAction">
            <argument type="service" id="api.serializer" />
        </service>

        <service id="api.action.get_item" class="Dunglas\ApiBundle\Action\GetItemAction">
            <argument type="service" id="api.data_provider" />
        </service>

        <service id="api.action.put_item" class="Dunglas\ApiBundle\Action\PutItemAction">
            <argument type="service" id="api.data_provider" />
            <argument type="service" id="api.serializer" />
        </service>

        <service id="api.action.delete_item" class="Dunglas\ApiBundle\Action\DeleteItemAction">
            <argument type="service" id="api.data_provider" />
        </service>

        <service id="api.resource_resolver" class="Dunglas\ApiBundle\Api\ResourceResolver">
            <argument type="service" id="api.resource_collection" />
        </service>

    </services>

</container>
