# Copyright 2008-2009 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 import sys __all__ = ['ObjectProxy'] class ObjectProxy(object): """ Object that acts as a proxy to another object, forwarding attribute accesses and method calls. This can be useful for implementing lazy initialization. """ __slots__ = () def _get_target(self): raise NotImplementedError(self) def __getattribute__(self, attr): result = object.__getattribute__(self, '_get_target')() return getattr(result, attr) def __setattr__(self, attr, value): result = object.__getattribute__(self, '_get_target')() setattr(result, attr, value) def __call__(self, *args, **kwargs): result = object.__getattribute__(self, '_get_target')() return result(*args, **kwargs) def __setitem__(self, key, value): object.__getattribute__(self, '_get_target')()[key] = value def __getitem__(self, key): return object.__getattribute__(self, '_get_target')()[key] def __delitem__(self, key): del object.__getattribute__(self, '_get_target')()[key] def __contains__(self, key): return key in object.__getattribute__(self, '_get_target')() def __iter__(self): return iter(object.__getattribute__(self, '_get_target')()) def __len__(self): return len(object.__getattribute__(self, '_get_target')()) def __repr__(self): return repr(object.__getattribute__(self, '_get_target')()) def __str__(self): return str(object.__getattribute__(self, '_get_target')()) def __add__(self, other): return self.__str__() + other def __hash__(self): return hash(object.__getattribute__(self, '_get_target')()) def __ge__(self, other): return object.__getattribute__(self, '_get_target')() >= other def __gt__(self, other): return object.__getattribute__(self, '_get_target')() > other def __le__(self, other): return object.__getattribute__(self, '_get_target')() <= other def __lt__(self, other): return object.__getattribute__(self, '_get_target')() < other def __eq__(self, other): return object.__getattribute__(self, '_get_target')() == other def __ne__(self, other): return object.__getattribute__(self, '_get_target')() != other def __bool__(self): return bool(object.__getattribute__(self, '_get_target')()) if sys.hexversion < 0x3000000: __nonzero__ = __bool__ def __unicode__(self): return unicode(object.__getattribute__(self, '_get_target')()) def __int__(self): return int(object.__getattribute__(self, '_get_target')())