Validate the data

        Check also that no extra properties are present.

        :raises: ValidationError if the data is not valid.

def validate(self, data=None):
        """ Validate the data

        Check also that no extra properties are present.

        :raises: ValidationError if the data is not valid.
        """

        errors = {}

        data = self._getData(data)

        # validate each field, one by one
        for name, field in self.fields.items():
            try:
                field.clean(data.get(name))
            except ValidationError, e:
                errors[name] = e.messages
            except AttributeError, e:
                raise ValidationError('data should be of type dict but is %s' % (type(data),))

        # check for extra fields
        extras = set(data.keys()) - set(self.fields.keys())
        if extras:
            errors[', '.join(extras)] = ['field(s) not allowed']

        # if errors, raise ValidationError
        if errors:
            raise ValidationError(errors)