1 |
commit: c5c196a9a80e19a1f61379db1c9b9592cf6a1fc6 |
2 |
Author: André Erdmann <dywi <AT> mailerd <DOT> de> |
3 |
AuthorDate: Thu Aug 29 09:14:37 2013 +0000 |
4 |
Commit: André Erdmann <dywi <AT> mailerd <DOT> de> |
5 |
CommitDate: Thu Aug 29 09:14:37 2013 +0000 |
6 |
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/R_overlay.git;a=commit;h=c5c196a9 |
7 |
|
8 |
roverlay/util/objects: weak-referenced object view |
9 |
|
10 |
expose a (sub-)set of an object's information without depending on its existence |
11 |
(= keeping it in memory due to reference count). |
12 |
|
13 |
--- |
14 |
roverlay/util/objects.py | 39 +++++++++++++++++++++++++++++++++++++++ |
15 |
1 file changed, 39 insertions(+) |
16 |
|
17 |
diff --git a/roverlay/util/objects.py b/roverlay/util/objects.py |
18 |
index dd19046..28cc4e8 100644 |
19 |
--- a/roverlay/util/objects.py |
20 |
+++ b/roverlay/util/objects.py |
21 |
@@ -4,6 +4,8 @@ |
22 |
# Distributed under the terms of the GNU General Public License; |
23 |
# either version 2 of the License, or (at your option) any later version. |
24 |
|
25 |
+import weakref |
26 |
+ |
27 |
class MethodNotImplementedError ( NotImplementedError ): |
28 |
def __init__ ( self, obj, method, msg=None ): |
29 |
if isinstance ( obj, str ): |
30 |
@@ -67,3 +69,40 @@ def abstractmethod ( func=None ): |
31 |
def not_implemented ( func=None ): |
32 |
return _get_exception_wrapper ( MethodNotImplementedError, func ) |
33 |
# --- end of not_implemented (...) --- |
34 |
+ |
35 |
+ |
36 |
+class ObjectView ( object ): |
37 |
+ |
38 |
+ class ObjectDisappeared ( Exception ): |
39 |
+ pass |
40 |
+ # --- end of ObjectDisappeared --- |
41 |
+ |
42 |
+ def __init__ ( self, obj ): |
43 |
+ super ( ObjectView, self ).__init__() |
44 |
+ self.obj_ref = weakref.ref ( obj ) if obj is not None else None |
45 |
+ # --- end of __init__ (...) --- |
46 |
+ |
47 |
+ def __bool__ ( self ): |
48 |
+ return ( self.obj_ref is not None and self.obj_ref() is not None ) |
49 |
+ # --- end of __bool__ (...) --- |
50 |
+ |
51 |
+ def deref_unsafe ( self ): |
52 |
+ return None if self.obj_ref is None else self.obj_ref() |
53 |
+ # --- end of deref_unsafe (...) --- |
54 |
+ |
55 |
+ def deref_safe ( self ): |
56 |
+ obj = None if self.obj_ref is None else self.obj_ref() |
57 |
+ if obj is None: |
58 |
+ raise self.__class__.ObjectDisappeared() |
59 |
+ else: |
60 |
+ return obj |
61 |
+ # --- end of deref_safe (...) --- |
62 |
+ |
63 |
+ deref = deref_safe |
64 |
+ |
65 |
+ @abstractmethod |
66 |
+ def update ( self ): |
67 |
+ pass |
68 |
+ # --- end of update (...) --- |
69 |
+ |
70 |
+# --- end of ObjectView --- |