func (self *Server) LoadTemplates() error {
	if err := pongo.Initialize(); err != nil {
		return nil
	}

	return filepath.Walk(self.TemplatePath, func(filename string, info os.FileInfo, err error) error {
		log.Debugf("File in template path: %s (err: %v)", filename, err)

		if err == nil {
			if info.Mode().IsRegular() && !strings.HasPrefix(path.Base(filename), `_`) {
				ext := path.Ext(filename)
				key := strings.TrimSuffix(strings.TrimPrefix(filename, path.Clean(self.TemplatePath)+`/`), ext)

				if _, ok := self.Templates[key]; !ok {
					var tpl engines.ITemplate

					switch ext {
					case `.pongo`:
						tpl = pongo.New()
					default:
						return nil
					}

					tpl.SetTemplateDir(self.TemplatePath)

					log.Debugf("Load template at %s: %T: [%s] %s", filename, tpl, key, tpl.GetTemplateDir())

					if err := tpl.Load(key); err == nil {
						self.Templates[key] = tpl
					} else {
						log.Warnf("Error loading template '%s': %v", filename, err)
						return nil
					}
				} else {
					log.Warnf("Cannot load template '%s', key was already loaded", filename)
				}
			}
		}

		return nil
	})
}
func (self *Server) Serve() error {
	self.router = httprouter.New()

	self.RoutePrefix = strings.TrimSuffix(self.RoutePrefix, `/`)

	self.router.GET(fmt.Sprintf("%s/*path", self.RoutePrefix), func(w http.ResponseWriter, req *http.Request, params httprouter.Params) {
		routePath := params.ByName(`path`)
		tplKey := routePath
		var tpl engines.ITemplate

		if tplKey == `/` || tplKey == `` {
			tplKey = `/index`
		}

		parts := strings.Split(tplKey, `/`)
		parts = parts[1:len(parts)]

		for i, _ := range parts {
			key := strings.Join(parts[0:len(parts)-i], `/`)
			// log.Infof("Trying: %s", key)

			if t, ok := self.Templates[key+`/index`]; ok {
				tpl = t
				break
			} else if t, ok := self.Templates[key]; ok {
				tpl = t
				break
			}
		}

		//  template was not found, attempt to load the index template
		if tpl == nil {
			if t, ok := self.Templates[`index`]; ok {
				tpl = t
			}
		}

		if tpl != nil {
			routeBindings := self.GetBindings(req.Method, routePath, req)
			allParams := make(map[string]interface{})
			allRouteParams := make(map[string]interface{})

			for _, binding := range routeBindings {
				for k, v := range binding.ResourceParams {
					allParams[k] = v
				}

				for k, v := range binding.RouteParams {
					allRouteParams[k] = v
				}
			}

			payload := map[string]interface{}{
				`route`:        params.ByName(`path`),
				`route_params`: allRouteParams,
				`params`:       allParams,
			}

			bindingData := make(map[string]interface{})

			for key, binding := range routeBindings {
				if data, err := binding.Evaluate(req, params); err == nil {
					bindingData[key] = data
				} else {
					log.Errorf("Binding '%s' failed to evaluate: %v", key, err)
				}
			}

			payload[`data`] = bindingData

			// log.Debugf("Data for %s\n---\n%+v\n---\n", routePath, payload)

			if err := tpl.Render(w, payload); err != nil {
				http.Error(w, err.Error(), http.StatusInternalServerError)
			}

		} else {
			http.Error(w, fmt.Sprintf("Template '%s' not found", tplKey), http.StatusNotFound)
		}
	})

	staticHandler := negroni.NewStatic(http.Dir(self.StaticPath))

	if self.RoutePrefix != DEFAULT_ROUTE_PREFIX {
		staticHandler.Prefix = self.RoutePrefix
	}

	self.server = negroni.New()
	self.server.Use(negroni.NewRecovery())
	self.server.Use(staticHandler)
	self.server.UseHandler(self.router)

	self.server.Run(fmt.Sprintf("%s:%d", self.Address, self.Port))
	return nil
}