text: import inspect
  
  
  # helper classes to allow for classproperties similar to class methods
  # see https://stackoverflow.com/questions/5189699/how-to-make-a-class-property
  # for details
  class ClassPropertyDescriptor(object):
      def __init__(self, fget, fset=None):
          self.fget = fget
          self.fset = fset
  
      def __get__(self, obj, klass=None):
          if klass is None:
              klass = type(obj)
          return self.fget.__get__(obj, klass)()
  
      def __set__(self, obj, value):
          if not self.fset:
              raise AttributeError("can't set attribute")
          if inspect.isclass(obj):
              type_ = obj
              obj = None
          else:
              type_ = type(obj)
          return self.fset.__get__(obj, type_)(value)
  
      def setter(self, func):
          if not isinstance(func, (classmethod, staticmethod)):
              func = classmethod(func)
          self.fset = func
          return self
  
  
  def classproperty(func):
      if not isinstance(func, (classmethod, staticmethod)):
          func = classmethod(func)
  
      return ClassPropertyDescriptor(func)
  
  
  class ClassPropertyMetaClass(type):
      def __setattr__(self, key, value):
          if key in self.__dict__:
              obj = self.__dict__.get(key)
          if obj and type(obj) is ClassPropertyDescriptor:
              return obj.__set__(self, value)
  
          return super(ClassPropertyMetaClass, self).__setattr__(key, value)
  