def diff(cls, *args, **kwargs):
        newkeys = bool(kwargs.get('newkeys', False))
        ignore = kwargs.get('ignore', list())
        if len(args) < 2:
            raise ValueError('less than two ents given to Ent.diff()')
        elif not all(isinstance(s, Ent) for s in args):
            raise ValueError('all positional arguments to Ent.diff() must '
                             'be instances of Ent')
        s1 = args[0]
        differences = Ent()
        for s2 in args[1:]:
            for key, value in s2.__dict__.items():
                if key in ignore:
                    continue
                if key in s1.__dict__:
                    v1 = s1.__dict__[key]
                    if type(value) == type(v1):
                        if isinstance(v1, Ent):
                            delta = cls.diff(v1, value, **kwargs)
                            if len(delta.__dict__):
                                differences.__dict__[key] = delta
                        elif v1 != value:
                            differences.__dict__[key] = cls.load(value)
                elif newkeys:
                    differences.__dict__[key] = cls.load(value)
            s1 = s2
        return differences