# From http://blog.pythonisito.com/2008/08/lazy-descriptors.html

class lazy_property(object):
	"""
	A @property-like decorator with lazy evaluation

	>>> class Foo:
	... 	@lazy_property
	... 	def answer(self):
	... 		print("calculating answer...")
	... 		return 2*3*7
	>>> foo = Foo()
	>>> foo.answer
	calculating answer...
	42
	>>> foo.answer
	42
	"""

	def __init__(self, method):
		self._method = method
		self.__name__ = method.__name__
		self.__doc__ = method.__doc__

	def __get__(self, obj, cls=None):
		if obj is None:  # to fix issues with pydoc
			return None
		result = self._method(obj)
		obj.__dict__[self.__name__] = result
		return result

if __name__ == '__main__':
	import doctest
	doctest.testmod()
