public ITypeBuilderStrategy Build(IActionConfiguration actionConfiguration, Type returnType)
        {
            string key = actionConfiguration.ActionMethodInfo.ToString() + returnType.ToString();

            return StrategyCache.GetCachedOrAdd(key,
                () =>
                {
                    var sirenMetadataTypes = actionConfiguration.MetadataProvider.GetRegisteredMetadataTypes().ToList();

                    Func<CustomAttributeBuilder> jsonPropAttrNullValueHandling = () =>
                    {
                        var type = typeof (JsonPropertyAttribute);

                        var ctor = type.GetConstructor(Type.EmptyTypes);

                        return new CustomAttributeBuilder(ctor,
                            new object[] {},
                            new[] {type.GetProperty("NullValueHandling")}, new object[] {NullValueHandling.Ignore});
                    };

                    // Do not use IActionConfiguration from parameter list as configuration might be altered on call
                    Action<object, object, IActionConfiguration> classNameAssigner =
                        (proxyObject, originalObject, configuration) =>
                        {
                            var classProp = proxyObject.GetType().GetProperty("class");
                            classProp.SetValue(proxyObject, configuration.Class);
                        };

                    var strategyBuilder = new StrategyBuilder()
                        .For(returnType)
                        .WithPayloadPropertyStrategy(returnType, "properties")
                        .WithSimpleAttributedPropertyStrategy(typeof(string[]), "class", new [] { jsonPropAttrNullValueHandling })
                        .WithSimpleAttributedPropertyStrategy(typeof(string), "href", new[] { jsonPropAttrNullValueHandling })
                        .WithSimpleAttributedPropertyStrategy(typeof(string[]), "rel", new[] { jsonPropAttrNullValueHandling })
                        .WithCustomActivationStrategy(classNameAssigner);

                    sirenMetadataTypes.ForEach(metadataType => strategyBuilder.WithTypedMetadataProperty(metadataType, metadataType.Name.ToLower()));

                    return strategyBuilder.Build();
                });
        }
        public ITypeBuilderStrategy Build(IActionConfiguration actionConfiguration, Type returnType)
        {
            string key = actionConfiguration.ActionMethodInfo.ToString() + returnType.ToString();

            return StrategyCache.GetCachedOrAdd(key,
                () =>
                {
                    var rels =
                        (Dictionary<string, IList<string>>)
                            actionConfiguration.MetadataProvider.GetMetadataByType(
                                typeof (Dictionary<string, IList<string>>));

                    IList<string> topRels = rels.Values.ToList().ConvertAll(c => c.FirstOrDefault());

                    var strategyBuilder = new StrategyBuilder()
                        .For(returnType)
                        .WithSimpleProperties()
                        .WithPlainRouteInformation(topRels);

                    return strategyBuilder.Build();
                });
        }