public void Subscribe(RootBuilder describe) {
     describe.Scope("Content",content => {
         // Root all items in layout
         content.Factory<RootShape, dynamic>((context) =>
         {
             var layout = _workContextAccessor.GetContext().Layout;
             var item = context.Get<Model, object>() as IContent;
             // Save the item there so we can use correct CSS class in layout
             layout.ContentItem = item;
             layout.Title = item.ContentItem.ContentManager.GetItemMetadata(item.ContentItem).DisplayText;
             return layout;
         }
         );
         // Prevent displaying anything in Content zone on layout
         content.Factory<ActionResultBuilder, Func<ControllerBase, object, ActionResult>>((context) => (c, o) => {
             // Return Null (empty) view
             return new ViewResult() {
                 MasterName = null,
                 ViewName = "Null",
                 ViewData = c.ViewData,
                 TempData = c.TempData
             };
         });
     });
 }
        public void Subscribe(RootBuilder describe) {

            describe.Scope("Search.Fallback", compose => {

                // Chain include content list
                compose.Chain("ContentList");

                // We get the dud path from the url
                compose.Parameter<string>("path", path => {

                    path.Mutate<ContentList, ContentListQuery>((q, context) => {
                        string param = path.Get(context);
                        string endBit = param;
                        var pos = param.LastIndexOf('/');
                        if (pos >= 0) {
                            endBit = param.Substring(pos + 1);
                        }
                        endBit = endBit.Replace('-', ' ');
                        // TODO: Any other replaces to fix url special chars etc.?

                        q.Query = q.Query.Where<TitlePartRecord>(t => t.Title.Contains(endBit));
                    });
                });
            });

        }
        public void Subscribe(RootBuilder describe) {
            describe.Global(global => {
                global.Factory<RootShapeBuilder, dynamic>(context => {
                    var model = context.Get<Model, object>();
                    var root = context.Get<RootShape, dynamic>();
                    if (model != null) {
                        var builder = context.Get<ModelBuilder, ModelShapeBuilder>();
                        _origami.Build(builder, root);
                    }
                    return root;
                });
                global.Factory<ActionResult>((context) => {
                    dynamic root = context.Get<RootShapeBuilder, object>();
                    var controller = context.Single<ControllerBase>();
                    dynamic display = context.Get<DisplayShape, object>();
                    return context.Get<ActionResultBuilder, Func<ControllerBase, object, ActionResult>>()(controller, display);
                });

                global.Factory<ActionResultBuilder, Func<ControllerBase, object, ActionResult>>((context) => (c, o) => {
                    return new ShapeResult(c, o);
                });

                global.Factory<ShapeMetadataFactory, ShapeMetadata>((context) => new ShapeMetadata() {
                    DisplayType = "Detail",
                });
                global.Factory<DisplayShape, dynamic>((context) => context.Get<RootShape, dynamic>());
                global.Factory<ModelBuilder, ModelShapeBuilder>((context) => _origami.Builder(context.Get<Model, object>()).WithDisplayType(context.Get<ShapeMetadataFactory, ShapeMetadata>().DisplayType).WithMode("Display"));
            });
            describe.Scope("Ajax", ajax => {
                ajax.Factory<ActionResultBuilder, Func<ControllerBase, object, ActionResult>>((context2) => (c, o) => {
                    return new ShapePartialResult(c, o);
                });
            });
        }
 public void Subscribe(RootBuilder describe) {
     describe.Scope("Content", mix => {
         mix.Factory<RootShape, dynamic>((context) => _origami.ContentShape(context.Get<Model, object>() as IContent, context.Get<ShapeMetadataFactory, ShapeMetadata>().DisplayType));
         mix.Factory<ModelBuilder, ModelShapeBuilder>((context) => _origami.ContentBuilder(context.Get<Model, object>() as IContent).WithDisplayType(context.Get<ShapeMetadataFactory, ShapeMetadata>().DisplayType));
         mix.Parameter<int>("contentId", (mix2) => {
             mix2.Factory<Model, object>((ctx) => _contentManager.Get(mix2.Get(ctx), VersionOptions.Published));
         });
     });
 }
        public void Subscribe(RootBuilder describe) {
            describe.Scope("ContentList", mix => {
                mix.Factory<RootShape,dynamic>((context) => Shape.ContentList(ListItems:((ContentListViewModel)context.Get<Model,object>()).Rendered));
                mix.Factory<ContentList,ShapeMetadata>((context) => new ShapeMetadata() {
                    DisplayType = "Summary",
                });
                mix.Factory<ContentList,ParadigmsContext>((context) => new ParadigmsContext());
                mix.Factory<ContentList,ContentListQuery>((context) => new ContentListQuery() { Query = _contentManager.Query() });
                mix.Factory<ContentList,IEnumerable<IContent>>((context) => {
                    var query = context.Get<ContentList, ContentListQuery>();
                    var pager = context.Get<ContentList,PagerData>();
                    if (pager!=null) 
                        return query.Query.Slice(pager.PageSize*(pager.Page-1),pager.PageSize);
                    return query.Query.List();
                });
                mix.Factory<ContentModelBuilder, Func<IContent, ModelShapeBuilder>>((context) => (c) => Builder(c, context));
                // TODO: Could support prefix here
                mix.Factory<ContentShapeBuilder, Func<IContent, object>>((context) => (s) => _origami.ContentShape(s, context.Get<ContentList, ShapeMetadata>().DisplayType));
                mix.Factory<Model,object>((context) => {
                    var source = context.Get<ContentList,IEnumerable<IContent>>();
                    var builder = context.Get<ContentModelBuilder, Func<IContent,ModelShapeBuilder>>();
                    return new ContentListViewModel() {
                        Rendered = source.Select(s => {
                            var root = context.Get<ContentShapeBuilder, Func<IContent, object>>()(s);
                            _origami.Build(builder(s), root);
                            return root;
                        }).ToList()
                    };
                });
                // TODO: Get page size from settings
                mix.Factory<ContentList,PagerData>((context) => {
                    var pager = new PagerData() {
                        Page = 1,
                        PageSize = 10
                    };
                    return pager;
                });
                mix.Parameter<int>("PageSize", (pageSize) => {
                    pageSize.Mutate<ContentList, PagerData>((pager, context) => { pager.PageSize = pageSize.Get(context); });
                });
                mix.Parameter<int>("Page", (page) => {
                    page.Mutate<ContentList, PagerData>((pager, context) => { pager.Page = page.Get(context); });
                });
                mix.Parameter<string>("ContentType", (ct) => {
                    ct.Mutate<ContentList, ContentListQuery>((q,context) => q.Query = q.Query.ForType(ct.Get(context)));
                });
                mix.Parameter<string>("ContentTypes", (ct) => {
                    ct.Mutate<ContentList, ContentListQuery>((q, context) => q.Query = q.Query.ForType(ct.Get(context).Split(new[]{','},StringSplitOptions.RemoveEmptyEntries)));
                });
                // Calculate total pages at end
                mix.Mutate<ContentList, PagerData>((pager, context) => {
                    var query = context.Get<ContentList, ContentListQuery>();
                    pager.TotalPages = query.Query.Count() / pager.PageSize; // TODO: Check calculation
                });

            });
        }
        public void Subscribe(RootBuilder describe) {

            describe.Scope("Content.Edit", compose => {
                compose.Chain("Content");


            });

        }
        public void Subscribe(RootBuilder describe) {
            describe.Scope("Search.Ajax", compose => {
                // Following mutate should be in LensCompositionProvider?
                compose.Mutate<ContentList, ParadigmsContext>((p, context) => p.Add("Lens"));
                compose.Parameter<String>("context", param => {
                    // Context comes from a data attribute on the lens element
                    param.Mutate<ContentList, ParadigmsContext>((p,context) => {
                                switch (param.Get(context)) {
                                    case "Socket":
                                        p.Add("LensSocket");
                                        break;
                                    case "Search":
                                        p.Add("LensSearch");
                                        break;
                                }
                            });
                    });
                compose.Parameter<string>("contentTypes", param => {
                    param.Mutate<ContentListQuery, ContentListQuery>((q,context) => {
                        var types = param.Get(context).Split(',');
                        q.Query = q.Query.ForType(types);
                    });
                });
            });
            /*
            describe.Scope("Mechanics.Connector", compose => {
                compose.Chain("Content.Edit");
                compose.Chain("Ajax");
                compose.Factory<Model, object>((context) => {
                    var model = new ConnectorDisplayContext(
                });
                compose.Factory<Model, SocketsPart>((context) => context.Get<Model,IContent>().As<SocketsPart>());
                compose.Factory<RootShape, dynamic>((context) => {
                    var content = context.Get<Model,IContent>();
                    var socket = content.As<SocketsPart>();

                    return Shape.Connector_Edit(
                        ContentItem: c.SocketContext.Left.ContentItem,
                        RightContentItem: c.Right.Content,
                        ConnectorType: c.Descriptor.Name,
                        RightContentType: c.Right.ContentType,
                        LeftContentType: c.SocketContext.Left.ContentType);
                compose.Parameter<string>("socketName", leftId => {

                });
                compose.Parameter<int>("newRightId", rightId => {
                    compose.Factory<Model,IConnector>
                    var socket = context.Get<Model,SocketsPart>();

                });
            });*/
        }
        public void Subscribe(RootBuilder describe) {
            describe.Scope("Plumbing.Drill", drill => {
                drill.Chain("Content");
                drill
                .Parameter<int>("drillId", param => {
                    param.Factory<DrillContent>((context) => {
                        var c = _contentManager.Get<ConnectorPart>(param.Get(context));
                        if (c == null) return null;
                        return new DrillContent() {
                            Connector = c,
                            Left = c.LeftContent,
                            Right = c.RightContent
                        };
                    });

                    param.Factory<Model, object>((context) => {
                        return context.Get<DrillContent>().Left;
                    });
                    param.Factory<DrillContent, DrillFilterData>((context) => {
                        var content = context.Get<DrillContent>();
                        if (content == null) return null;
                        var drillPart = content.Connector.As<DrillRoutePart>();
                        if (drillPart == null) return null;
                        return new DrillFilterData() {
                            Id = content.Connector.Id,
                            // TODO: DisplayType is kinda redundant here; need to handle in Placement?
                            DisplayType = "Detail",
                            DrillType = content.Connector.ContentItem.TypeDefinition.Name
                        };
                    });
                    param.Factory<DrillContent, ModelShapeBuilder>(msb => {
                        return _origami.Builder(msb.Get<DrillContent>().Right).WithDisplayType(msb.Get<ShapeMetadataFactory, ShapeMetadata>().DisplayType).WithMode("Display").WithParadigms(new[]{"DrillDetail"});});

/*                    param.Mutate<ModelBuilder, ModelShapeBuilder>((msb, context) => {
                        // Push drill data into model builder context
                        msb.Context.CustomContext[typeof(DrillFilterData)] = context.Get<DrillContent, DrillFilterData>();
                        msb.WithParadigms(new[] { "DrillDetail" });
                    });*/
                    param.Mutate<RootShapeBuilder, dynamic>((root, context) => {
                        var model = context.Get<DrillContent>().Right;
                        if (model != null) {
                            var builder = context.Get<DrillContent, ModelShapeBuilder>();
                            _origami.Build(builder, root);
                        }
                    });
                });
            });
        }
        public void Subscribe(RootBuilder describe) {
            describe.Scope("Search.Ajax", compose => {

                // Chain include content list
                compose.Chain("Ajax");
                compose.Chain("ContentList");

                // Hijack with our own bits
                compose.Parameter<string>("query", query => {
                    query.Mutate<ContentList, ContentListQuery>((q,context) => {
                        q.Query = q.Query.Where<TitlePartRecord>(t => t.Title.StartsWith(query.Get(context)));
                    });
                });
                compose.Mutate<ContentList, ParadigmsContext>((p,context) => {
                    p.Add("LensResult");
                });
                compose.Mutate<ContentList, ShapeMetadata>((metadata,context) => {
                });
            });
        }