code: def compile(self):
          
          if self._compiled:
              return
  
          self.decodable_properties = set()
          self.encodable_properties = set()
          self.inherited_dynamic = None
          self.inherited_sealed = None
          self.bases = []
  
          self.exclude_attrs = set(self.exclude_attrs or [])
          self.readonly_attrs = set(self.readonly_attrs or [])
          self.static_attrs = list(self.static_attrs or [])
          self.static_attrs_set = set(self.static_attrs)
          self.proxy_attrs = set(self.proxy_attrs or [])
  
          self.sealed = util.is_class_sealed(self.klass)
  
          if self.external:
              self._checkExternal()
              self._finalise_compile()
  
              # this class is external so no more compiling is necessary
              return
  
          if hasattr(self.klass, '__slots__'):
              self.decodable_properties.update(self.klass.__slots__)
              self.encodable_properties.update(self.klass.__slots__)
  
          for k, v in self.klass.__dict__.iteritems():
              if not isinstance(v, property):
                  continue
  
              if v.fget:
                  self.encodable_properties.update([k])
  
              if v.fset:
                  self.decodable_properties.update([k])
              else:
                  self.readonly_attrs.update([k])
  
          mro = inspect.getmro(self.klass)[1:]
  
          for c in mro:
              self._compile_base_class(c)
  
          self.getCustomProperties()
  
          self._finalise_compile()
docs: This compiles the alias into a form that can be of most benefit to the
          en/decoder.