def calcFieldNames(self, path = [], force_prefix = False):
        ''' prefixes the field names with the parent field name '''
        _fields = self.Schema()._fields

        for f in self.Schema().fields():
            if not getattr(f, 'prefixed', False) or force_prefix:
                # calcFieldNames are often called several times for the same
                # field, e.g. when copying a schema. We do not want to perform
                # prefixing everytime this method is called. We only want to
                # prefix field names in two cases:
                # a) The first time we process a field
                # b) If calcFieldNames is called recursively on subfields, to
                # apply the correct parent field names to the prefixing of a
                # subfield. In this case we set the paramter force_prefix.
                if not getattr(f, 'prefixed', False):
                    # only set old_name the first time we prefix a field - old_name
                    # is the original field name, that we want to use in all prefixings of a field.
                    f.old_name =  f.getName()
                    f.prefixed = 1
                f.__name__ = config.COMPOUND_FIELD_SEPERATOR.join(
                    [getattr(field, 'old_name', field.getName()) for field in path + [self] + [f]])
                #del _fields[old_name]
                _fields[f.__name__] = f
                if ICompoundField.providedBy(f):
                    f.calcFieldNames(path = path + [self], force_prefix = True)
    def calcFieldNames(self, path=[], force_prefix=False):
        ''' prefixes the field names with the parent field name '''
        _fields = self.Schema()._fields

        for f in self.Schema().fields():
            if not getattr(f, 'prefixed', False) or force_prefix:
                # calcFieldNames are often called several times for the same
                # field, e.g. when copying a schema. We do not want to perform
                # prefixing everytime this method is called. We only want to
                # prefix field names in two cases:
                # a) The first time we process a field
                # b) If calcFieldNames is called recursively on subfields, to
                # apply the correct parent field names to the prefixing of a
                # subfield. In this case we set the paramter force_prefix.
                if not getattr(f, 'prefixed', False):
                    # only set old_name the first time we prefix a field - old_name
                    # is the original field name, that we want to use in all prefixings of a field.
                    f.old_name = f.getName()
                    f.prefixed = 1
                f.__name__ = config.COMPOUND_FIELD_SEPERATOR.join([
                    getattr(field, 'old_name', field.getName())
                    for field in path + [self] + [f]
                ])
                #del _fields[old_name]
                _fields[f.__name__] = f
                if ICompoundField.providedBy(f):
                    f.calcFieldNames(path=path + [self], force_prefix=True)
    def getAttributes(self, instance, exclude_attrs=()):

        # remove fields delegated to other namespaces

        fields = instance.Schema().fields()
        for f in fields:
            if ICompoundField.isImplementedBy(f):
                yield self.getAttributeByName(f.getName())
    def getAttributes(self, instance, exclude_attrs=()):

        # remove fields delegated to other namespaces

        fields = instance.Schema().fields()
        for f in fields:
            if ICompoundField.isImplementedBy(f):
                yield self.getAttributeByName(f.getName())