<?xml version="1.0" encoding="UTF-8"?>

<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>
        <!-- Event Dispatcher -->
        <service id="jms_serializer.event_dispatcher" class="JMS\Serializer\EventDispatcher\LazyEventDispatcher" public="false">
            <argument type="service" id="service_container" />
        </service>

        <service id="jms_serializer.doctrine_proxy_subscriber" class="JMS\Serializer\EventDispatcher\Subscriber\DoctrineProxySubscriber" public="false">
            <argument type="constant">true</argument>
            <argument type="constant">false</argument>
            <tag name="jms_serializer.event_subscriber" />
        </service>

        <service id="jms_serializer.stopwatch_subscriber" class="JMS\SerializerBundle\Serializer\StopwatchEventSubscriber" public="false">
            <tag name="jms_serializer.event_subscriber" />
            <argument type="service" id="debug.stopwatch" />
        </service>

        <!-- Handlers -->
        <service id="jms_serializer.handler_registry" class="JMS\Serializer\Handler\LazyHandlerRegistry">
            <argument type="service" id="service_container" />
        </service>
        <service id="jms_serializer.array_collection_handler" class="JMS\Serializer\Handler\ArrayCollectionHandler" public="false">
            <argument type="constant">false</argument>
            <tag name="jms_serializer.subscribing_handler" />
        </service>
        <service id="jms_serializer.constraint_violation_handler" class="JMS\Serializer\Handler\ConstraintViolationHandler" public="false">
            <tag name="jms_serializer.subscribing_handler" />
        </service>
        <service id="jms_serializer.datetime_handler" class="JMS\Serializer\Handler\DateHandler" public="false">
            <tag name="jms_serializer.subscribing_handler" />
        </service>
        <service id="jms_serializer.form_error_handler" class="JMS\Serializer\Handler\FormErrorHandler" public="false">
            <argument type="service" id="translator" on-invalid="null" />
            <tag name="jms_serializer.subscribing_handler" />
        </service>
        <service id="jms_serializer.iterator_handler" class="JMS\Serializer\Handler\IteratorHandler" public="false">
            <tag name="jms_serializer.subscribing_handler" />
        </service>

        <!-- Metadata Drivers -->
        <service id="jms_serializer.type_parser" class="JMS\Serializer\Type\Parser" public="false"/>

        <service id="jms_serializer.metadata.file_locator" class="Metadata\Driver\FileLocator" public="false">
            <argument type="collection" /><!-- Namespace Prefixes mapping to Directories -->
        </service>
        <service id="jms_serializer.metadata.yaml_driver" class="JMS\Serializer\Metadata\Driver\YamlDriver" public="false">
            <argument type="service" id="jms_serializer.metadata.file_locator" />
            <argument type="service" id="jms_serializer.naming_strategy" />
            <argument type="service" id="jms_serializer.type_parser" on-invalid="null" />
        </service>
        <service id="jms_serializer.metadata.xml_driver" class="JMS\Serializer\Metadata\Driver\XmlDriver" public="false">
            <argument type="service" id="jms_serializer.metadata.file_locator" />
            <argument type="service" id="jms_serializer.naming_strategy" />
            <argument type="service" id="jms_serializer.type_parser" on-invalid="null" />
        </service>
        <service id="jms_serializer.metadata.annotation_driver" class="JMS\Serializer\Metadata\Driver\AnnotationDriver" public="false">
            <argument type="service" id="annotation_reader" />
            <argument type="service" id="jms_serializer.naming_strategy" />
            <argument type="service" id="jms_serializer.type_parser" on-invalid="null" />
        </service>
        <service id="jms_serializer.metadata.chain_driver" class="Metadata\Driver\DriverChain" public="false">
            <argument type="collection">
                <argument type="service" id="jms_serializer.metadata.yaml_driver" />
                <argument type="service" id="jms_serializer.metadata.xml_driver" />
                <argument type="service" id="jms_serializer.metadata.annotation_driver" />
            </argument>
        </service>

        <!-- extra metadata driver -->
        <service id="jms_serializer.metadata.doctrine_type_driver" class="JMS\Serializer\Metadata\Driver\DoctrineTypeDriver" public="false">
            <argument />
            <argument type="service" id="doctrine" />
            <argument type="service" id="jms_serializer.type_parser" />
        </service>
        <service id="jms_serializer.metadata.doctrine_phpcr_type_driver" class="JMS\Serializer\Metadata\Driver\DoctrinePHPCRTypeDriver" public="false">
            <argument />
            <argument type="service" id="doctrine_phpcr" />
            <argument type="service" id="jms_serializer.type_parser" />
        </service>
        <service id="jms_serializer.metadata.typed_properties_driver" class="JMS\Serializer\Metadata\Driver\TypedPropertiesDriver" public="false">
            <argument id="jms_serializer.metadata.typed_properties_driver.inner" type="service"/>
            <argument type="service" id="jms_serializer.type_parser" on-invalid="null" />
        </service>
        <service id="jms_serializer.metadata.doc_block_driver" class="JMS\Serializer\Metadata\Driver\DocBlockDriver" public="false">
            <argument id="jms_serializer.metadata.doc_block_driver.inner" type="service"/>
            <argument type="service" id="jms_serializer.type_parser" on-invalid="null" />
        </service>

        <service id="jms_serializer.metadata.service_locator" class="Symfony\Component\DependencyInjection\ServiceLocator" public="false">
            <argument type="collection">
                <argument key="metadata_driver" type="service" id="jms_serializer.metadata_driver" />
            </argument>

            <tag name="container.service_locator" />
        </service>

        <service id="jms_serializer.metadata.lazy_loading_driver" class="Metadata\Driver\LazyLoadingDriver" public="false">
            <argument type="service" id="jms_serializer.metadata.service_locator"/>
            <argument>metadata_driver</argument>
        </service>

        <service id="jms_serializer.metadata_driver" alias="jms_serializer.metadata.chain_driver" public="true"/>

        <!-- Metadata Factory -->
        <service id="jms_serializer.metadata.cache.file_cache" class="Metadata\Cache\FileCache" public="false">
            <argument /><!-- Directory -->
        </service>

        <service id="jms_serializer.metadata.cache" alias="jms_serializer.metadata.cache.file_cache" public="false" />
        <service id="jms_serializer.metadata_factory" class="Metadata\MetadataFactory" public="false">
            <argument type="service" id="jms_serializer.metadata.lazy_loading_driver" />
            <argument>Metadata\ClassHierarchyMetadata</argument>
            <argument />
            <call method="setCache">
                <argument type="service" id="jms_serializer.metadata.cache" on-invalid="ignore" />
            </call>
        </service>

        <!-- Exclusion Strategies -->
        <service id="jms_serializer.version_exclusion_strategy"
                 class="JMS\Serializer\Exclusion\VersionExclusionStrategy"
                 public="false"
                 abstract="true" />

        <!-- Naming Strategies -->
        <service id="jms_serializer.camel_case_naming_strategy" class="JMS\Serializer\Naming\CamelCaseNamingStrategy" public="false" />
        <service id="jms_serializer.identical_property_naming_strategy" class="JMS\Serializer\Naming\IdenticalPropertyNamingStrategy" public="false" />
        <service id="jms_serializer.serialized_name_annotation_strategy" class="JMS\Serializer\Naming\SerializedNameAnnotationStrategy" public="false">
            <argument type="service" id="jms_serializer.camel_case_naming_strategy" />
        </service>

        <service id="jms_serializer.naming_strategy" alias="jms_serializer.serialized_name_annotation_strategy" public="false" />

        <!-- Object Constructors -->
        <service id="jms_serializer.doctrine_object_constructor" class="JMS\Serializer\Construction\DoctrineObjectConstructor" public="false">
            <argument type="service" id="doctrine"/>
            <argument type="service" id="jms_serializer.unserialize_object_constructor"/>
            <argument type="string">null</argument>
        </service>
        <service id="jms_serializer.doctrine_phpcr_object_constructor" class="JMS\Serializer\Construction\DoctrineObjectConstructor" public="false">
            <argument type="service" id="doctrine_phpcr"/>
            <argument type="service" id="jms_serializer.unserialize_object_constructor"/>
        </service>
        <service id="jms_serializer.unserialize_object_constructor" class="JMS\Serializer\Construction\UnserializeObjectConstructor" public="false" />
        <service id="jms_serializer.object_constructor" alias="jms_serializer.unserialize_object_constructor" public="false" />

        <!-- Serializer -->
        <service id="jms_serializer.serializer" class="JMS\Serializer\Serializer" public="false">
            <argument type="service" id="jms_serializer.metadata_factory" />
            <argument type="collection">
                <argument key="2" type="service" id="jms_serializer.deserialization_graph_navigator_factory" />
                <argument key="1" type="service" id="jms_serializer.serialization_graph_navigator_factory" />
            </argument>
            <argument type="collection" /><!-- Serialization Visitors -->
            <argument type="collection" /><!-- Deserialization Visitors -->
            <argument type="service" id="jms_serializer.serialization_context_factory" />
            <argument type="service" id="jms_serializer.deserialization_context_factory" />
            <argument type="service" id="jms_serializer.type_parser" on-invalid="null" />
        </service>

        <service id="jms_serializer.deserialization_graph_navigator_factory" class="JMS\Serializer\GraphNavigator\Factory\DeserializationGraphNavigatorFactory" public="false">
            <argument type="service" id="jms_serializer.metadata_factory" />
            <argument type="service" id="jms_serializer.handler_registry" />
            <argument type="service" id="jms_serializer.object_constructor" />
            <argument type="service" id="jms_serializer.accessor_strategy" />
            <argument type="service" id="jms_serializer.event_dispatcher" />
            <argument type="constant">NULL</argument> <!-- expression evaluator -->
        </service>
        <service id="jms_serializer.serialization_graph_navigator_factory" class="JMS\Serializer\GraphNavigator\Factory\SerializationGraphNavigatorFactory" public="false">
            <argument type="service" id="jms_serializer.metadata_factory" />
            <argument type="service" id="jms_serializer.handler_registry" />
            <argument type="service" id="jms_serializer.accessor_strategy" />
            <argument type="service" id="jms_serializer.event_dispatcher" />
            <argument type="constant">NULL</argument> <!-- expression evaluator -->
        </service>

        <service id="jms_serializer.deserialization_context_factory" alias="jms_serializer.configured_deserialization_context_factory" public="true"/>
        <service id="jms_serializer.serialization_context_factory" alias="jms_serializer.configured_serialization_context_factory" public="true"/>

        <service id="jms_serializer" alias="jms_serializer.serializer" public="true"/><!-- Preferred Alias -->

        <service id="JMS\Serializer\SerializerInterface" alias="jms_serializer" public="false" />
        <service id="JMS\Serializer\ArrayTransformerInterface" alias="jms_serializer" public="false" />

        <!-- expression language components -->
        <service id="jms_serializer.expression_evaluator" class="JMS\Serializer\Expression\ExpressionEvaluator">
            <argument type="service" id="jms_serializer.expression_language"/>
            <argument type="collection">
                <argument type="service" key="container" id="service_container"/>
            </argument>
        </service>
        <service id="jms_serializer.expression_language" class="Symfony\Component\ExpressionLanguage\ExpressionLanguage" public="false"/>

        <service id="jms_serializer.expression_language.function_provider" class="JMS\SerializerBundle\ExpressionLanguage\BasicSerializerFunctionsProvider" public="false">
            <tag name="jms.expression.function_provider"/>
        </service>

        <!-- Twig Extension -->
        <service id="jms_serializer.twig_extension.serializer" class="JMS\Serializer\Twig\SerializerExtension" public="false">
            <argument type="service" id="jms_serializer" />
            <tag name="twig.extension" />
        </service>

        <service id="jms_serializer.twig_extension.serializer_runtime_helper" class="JMS\Serializer\Twig\SerializerRuntimeHelper" public="true">
            <argument type="service" id="jms_serializer" />
            <tag name="twig.runtime" />
        </service>

        <!-- PHP templating helper -->
        <service id="jms_serializer.templating.helper.serializer" class="JMS\SerializerBundle\Templating\SerializerHelper">
            <argument type="service" id="jms_serializer" />
            <tag name="templating.helper" alias="jms_serializer" />
        </service>


        <!-- accessor strategy -->
        <service id="jms_serializer.accessor_strategy" public="false" alias="jms_serializer.accessor_strategy.default"/>
        <service id="jms_serializer.accessor_strategy.default" public="false" class="JMS\Serializer\Accessor\DefaultAccessorStrategy"/>

        <!-- Visitors -->
        <service id="jms_serializer.json_serialization_visitor" class="JMS\Serializer\Visitor\Factory\JsonSerializationVisitorFactory" public="false">
            <tag name="jms_serializer.serialization_visitor" format="json" />
        </service>
        <service id="jms_serializer.json_deserialization_visitor" class="JMS\Serializer\Visitor\Factory\JsonDeserializationVisitorFactory" public="false">
            <tag name="jms_serializer.deserialization_visitor" format="json" />
        </service>
        <service id="jms_serializer.xml_serialization_visitor" class="JMS\Serializer\Visitor\Factory\XmlSerializationVisitorFactory" public="false">
            <tag name="jms_serializer.serialization_visitor" format="xml" />
        </service>
        <service id="jms_serializer.xml_deserialization_visitor" class="JMS\Serializer\Visitor\Factory\XmlDeserializationVisitorFactory" public="false">
            <tag name="jms_serializer.deserialization_visitor" format="xml" />
        </service>

        <service id="jms_serializer.cache.cache_clearer" class="JMS\SerializerBundle\Cache\CacheClearer" public="false">
            <argument type="service" id="jms_serializer.metadata.cache"/>
            <tag name="kernel.cache_clearer" />
        </service>

        <service id="jms_serializer.cache.cache_warmer" class="JMS\SerializerBundle\Cache\CacheWarmer" public="false">
            <argument/> <!-- included dirs -->
            <argument type="service" id="jms_serializer.metadata_factory"/>
            <argument/> <!-- excluded dirs -->
            <tag name="kernel.cache_warmer" />
        </service>

        <!-- context factories -->
        <service id="jms_serializer.configured_serialization_context_factory"
                 class="JMS\SerializerBundle\ContextFactory\ConfiguredContextFactory"
                 public="false" />
        <service id="jms_serializer.configured_deserialization_context_factory"
                 class="JMS\SerializerBundle\ContextFactory\ConfiguredContextFactory"
                 public="false" />

        <service id="JMS\Serializer\ContextFactory\SerializationContextFactoryInterface" alias="jms_serializer.configured_serialization_context_factory" public="false"/>
        <service id="JMS\Serializer\ContextFactory\DeserializationContextFactoryInterface" alias="jms_serializer.configured_deserialization_context_factory" public="false"/>
    </services>
</container>
