class StatisticNamespace(object):
    _registry = {}

    @classmethod
    def get_all(cls):
        return cls._registry.values()

    @classmethod
    def get(cls, name):
        return cls._registry[name]

    def __init__(self, name, label):
        self.name = name
        self.label = label
        self._statistics = []
        self.__class__._registry[name] = self

    def __unicode__(self):
        return unicode(self.label)

    def add_statistic(self, statistic):
        self._statistics.append(statistic)
        statistic.namespace = self

    @property
    def id(self):
        return self.name

    @property
    def statistics(self):
        return self._statistics


class Statistic(object):
    _registry = {}

    @classmethod
    def get_all(cls):
        return cls._registry.values()

    @classmethod
    def get(cls, name):
        return cls._registry[name]

    def __init__(self, name, label):
        self.name = name
        self.label = label
        self.__class__._registry[name] = self

    def __unicode__(self):
        return unicode(self.label)

    def get_results(self, *args, **kwargs):
        return NotImplemented

    @property
    def id(self):
        return self.name
