private object BuidlListHal(Promise<int> total, IEnumerable<Place> places, SearchPlacesParameters parameters)
        {
            var totalPages = total/parameters.PageSize;

            var builder = new HalBuilder(Request.Url.ToString())
                .AddProperty("pages", totalPages)
                .AddProperty("page", parameters.Page)
                .EmbedListResourceWithProperties(
                    "places",
                    places,
                    place => Settings.ToAbsolute(string.Format("/places/{0}", place.Id)),
                    place => place.Id,
                    place => place.EnglishName,
                    place => place.CornishName,
                    place => place.Type,
                    place => place.Parish);

            if (parameters.Page < totalPages)
                builder.AddLink("next", new SearchUrlBuilder(parameters).NextPage().Build());

            if (parameters.Page > 1)
                builder.AddLink("prev", new SearchUrlBuilder(parameters).PreviousPage().Build());

            return builder.Build();
        }
        private object BuidlListHal(Promise <int> total, IEnumerable <Place> places, SearchPlacesParameters parameters)
        {
            var totalPages = total / parameters.PageSize;

            var builder = new HalBuilder(Request.Url.ToString())
                          .AddProperty("pages", totalPages)
                          .AddProperty("page", parameters.Page)
                          .EmbedListResourceWithProperties(
                "places",
                places,
                place => Settings.ToAbsolute(string.Format("/places/{0}", place.Id)),
                place => place.Id,
                place => place.EnglishName,
                place => place.CornishName,
                place => place.Type,
                place => place.Parish);

            if (parameters.Page < totalPages)
            {
                builder.AddLink("next", new SearchUrlBuilder(parameters).NextPage().Build());
            }

            if (parameters.Page > 1)
            {
                builder.AddLink("prev", new SearchUrlBuilder(parameters).PreviousPage().Build());
            }

            return(builder.Build());
        }
        private object GetPlace(dynamic parameters)
        {
            var place = (Place)Database.Open().Places.FindById((int)parameters.id);

            OSRef gridRef = null;

            if (!string.IsNullOrEmpty(place.GridReference))
            {
                try
                {
                    gridRef = new OSRef(Regex.Replace(place.GridReference, @"\s+", ""));
                }
                catch
                {
                    //dont care
                }
            }

            var representation = new HalBuilder(Request.Url.ToString())
                                 .AddPublicPropertiesOf(place)
                                 .ConditionallyAddProperty("longitude", gridRef != null, () => gridRef.ToLatLng().Longitude)
                                 .ConditionallyAddProperty("latitude", gridRef != null, () => gridRef.ToLatLng().Latitude)
                                 .Build();

            return(Response.AsJson(representation));
        }
        private object Home(dynamic parameters)
        {
            var representation = new HalBuilder(Settings.ToAbsolute("/"))
                .AddLink("places-english", Settings.ToAbsolute("/places?keyword={keyword}&page={page}&pageSize={pageSize}"), templated: true)
                .AddLink("places-cornish", Settings.ToAbsolute("/places?cornishKeyword={keyword}&page={page}&pageSize={pageSize}"), templated: true)
                .AddLink("license", "http://creativecommons.org/licenses/by/3.0/")
                .AddProperty("description", "Welcome to the Cornish Places Names API")
                .Build();

            return Response.AsJson(representation);
        }
        private object Home(dynamic parameters)
        {
            var representation = new HalBuilder(Settings.ToAbsolute("/"))
                                 .AddLink("places-english", Settings.ToAbsolute("/places?keyword={keyword}&page={page}&pageSize={pageSize}"), templated: true)
                                 .AddLink("places-cornish", Settings.ToAbsolute("/places?cornishKeyword={keyword}&page={page}&pageSize={pageSize}"), templated: true)
                                 .AddLink("license", "http://creativecommons.org/licenses/by/3.0/")
                                 .AddProperty("description", "Welcome to the Cornish Places Names API")
                                 .Build();

            return(Response.AsJson(representation));
        }
        private object GetPlace(dynamic parameters)
        {
            var place = (Place)Database.Open().Places.FindById((int)parameters.id);

            OSRef gridRef = null;
            if(!string.IsNullOrEmpty(place.GridReference))
                try
                {
                    gridRef = new OSRef(Regex.Replace(place.GridReference, @"\s+", ""));
                }
                catch
                {
                    //dont care
                }

            var representation = new HalBuilder(Request.Url.ToString())
                .AddPublicPropertiesOf(place)
                .ConditionallyAddProperty("longitude", gridRef != null, ()=>gridRef.ToLatLng().Longitude)
                .ConditionallyAddProperty("latitude", gridRef != null, ()=>gridRef.ToLatLng().Latitude)
                .Build();

            return Response.AsJson(representation);
        }