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();
            }));
        }