summaryrefslogtreecommitdiffstats
path: root/pym/portage_util.py
diff options
context:
space:
mode:
Diffstat (limited to 'pym/portage_util.py')
-rw-r--r--pym/portage_util.py27
1 files changed, 27 insertions, 0 deletions
diff --git a/pym/portage_util.py b/pym/portage_util.py
index 46a7d1052..6fd76090c 100644
--- a/pym/portage_util.py
+++ b/pym/portage_util.py
@@ -710,3 +710,30 @@ def ensure_dirs(dir_path, *args, **kwargs):
raise
perms_modified = apply_permissions(dir_path, *args, **kwargs)
return created_dir or perms_modified
+
+class LazyItemsDict(dict):
+ """A mapping object that behaves like a standard dict except that it allows
+ for lazy initialization of values via callable objects. Lazy items can be
+ overwritten and deleted just as normal items."""
+ def __init__(self):
+ dict.__init__(self)
+ self.lazy_items = {}
+ def addLazyItem(self, item_key, value_callable):
+ """Add a lazy item for the given key. When the item is requested,
+ value_callable will be called with no arguments."""
+ self.lazy_items[item_key] = value_callable
+ # make it show up in self.keys(), etc...
+ dict.__setitem__(self, item_key, None)
+ def __getitem__(self, item_key):
+ if item_key in self.lazy_items:
+ return self.lazy_items[item_key]()
+ else:
+ return dict.__getitem__(self, item_key)
+ def __setitem__(self, item_key, value):
+ if item_key in self.lazy_items:
+ del self.lazy_items[item_key]
+ dict.__setitem__(self, item_key, value)
+ def __delitem__(self, item_key):
+ if item_key in self.lazy_items:
+ del self.lazy_items[item_key]
+ dict.__delitem__(self, item_key)