Project import generated by Copybara.

GitOrigin-RevId: d9e9e3fb4e31372ec1fb43b178994ca78fa8fe70
diff --git a/services/service_manager.py b/services/service_manager.py
new file mode 100644
index 0000000..1cb886a
--- /dev/null
+++ b/services/service_manager.py
@@ -0,0 +1,84 @@
+# Copyright 2016 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style
+# license that can be found in the LICENSE file or at
+# https://developers.google.com/open-source/licenses/bsd
+
+"""Service manager to initialize all services."""
+from __future__ import print_function
+from __future__ import division
+from __future__ import absolute_import
+
+from features import autolink
+from services import cachemanager_svc
+from services import chart_svc
+from services import config_svc
+from services import features_svc
+from services import issue_svc
+from services import project_svc
+from services import spam_svc
+from services import star_svc
+from services import template_svc
+from services import user_svc
+from services import usergroup_svc
+
+
+svcs = None
+
+
+class Services(object):
+  """A simple container for widely-used service objects."""
+
+  def __init__(
+      self, project=None, user=None, issue=None, config=None,
+      usergroup=None, cache_manager=None, autolink_obj=None,
+      user_star=None, project_star=None, issue_star=None, features=None,
+      spam=None, hotlist_star=None, chart=None, template=None):
+    # Persistence services
+    self.project = project
+    self.user = user
+    self.usergroup = usergroup
+    self.issue = issue
+    self.config = config
+    self.user_star = user_star
+    self.project_star = project_star
+    self.hotlist_star = hotlist_star
+    self.issue_star = issue_star
+    self.features = features
+    self.template = template
+
+    # Misc. services
+    self.cache_manager = cache_manager
+    self.autolink = autolink_obj
+    self.spam = spam
+    self.chart = chart
+
+
+def set_up_services():
+  """Set up all services."""
+
+  global svcs
+  if svcs is None:
+    # Sorted as: cache_manager first, everything which depends on it,
+    # issue (which depends on project and config), things with no deps.
+    cache_manager = cachemanager_svc.CacheManager()
+    config = config_svc.ConfigService(cache_manager)
+    features = features_svc.FeaturesService(cache_manager, config)
+    hotlist_star = star_svc.HotlistStarService(cache_manager)
+    issue_star = star_svc.IssueStarService(cache_manager)
+    project = project_svc.ProjectService(cache_manager)
+    project_star = star_svc.ProjectStarService(cache_manager)
+    user = user_svc.UserService(cache_manager)
+    user_star = star_svc.UserStarService(cache_manager)
+    usergroup = usergroup_svc.UserGroupService(cache_manager)
+    chart = chart_svc.ChartService(config)
+    issue = issue_svc.IssueService(project, config, cache_manager, chart)
+    autolink_obj = autolink.Autolink()
+    spam = spam_svc.SpamService()
+    template = template_svc.TemplateService(cache_manager)
+    svcs = Services(
+      cache_manager=cache_manager, config=config, features=features,
+      issue_star=issue_star, project=project, project_star=project_star,
+      user=user, user_star=user_star, usergroup=usergroup, issue=issue,
+      autolink_obj=autolink_obj, spam=spam, hotlist_star=hotlist_star,
+      chart=chart, template=template)
+  return svcs