--- /dev/null
+#!/usr/bin/python3
+###############################################################################
+# #
+# Westferry - The IPFire web user interface #
+# Copyright (C) 2015 IPFire development team #
+# #
+# This program is free software: you can redistribute it and/or modify #
+# it under the terms of the GNU General Public License as published by #
+# the Free Software Foundation, either version 3 of the License, or #
+# (at your option) any later version. #
+# #
+# This program is distributed in the hope that it will be useful, #
+# but WITHOUT ANY WARRANTY; without even the implied warranty of #
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
+# GNU General Public License for more details. #
+# #
+# You should have received a copy of the GNU General Public License #
+# along with this program. If not, see <http://www.gnu.org/licenses/>. #
+# #
+###############################################################################
+
+class Missing(object):
+ pass
+
+_missing = Missing()
+
+class lazy_property(property):
+ """
+ The property is only computed once and then being
+ cached until the end of the lifetime of the object.
+ """
+ def __init__(self, fget, fset=None, fdel=None, doc=None, name=None):
+ property.__init__(self, fget=fget, fset=fset, fdel=fdel, doc=doc)
+
+ self.__name__ = name or fget.__name__
+ self.__module__ = fget.__module__
+
+ def __get__(self, obj, type=None):
+ if object is None:
+ return self
+
+ value = obj.__dict__.get(self.__name__, _missing)
+ if value is _missing:
+ obj.__dict__[self.__name__] = value = self.fget(obj)
+
+ return value
+
+ def __set__(self, obj, value):
+ if self.fset:
+ self.fset(obj, value)
+
+ obj.__dict__[self.__name__] = value