util/stanza.lua

changeset 829
b01fd698495e
parent 776
89eb9f59993c
child 894
2c0b9e3c11c3
--- a/util/stanza.lua	Fri Feb 20 00:56:14 2009 +0500
+++ b/util/stanza.lua	Fri Feb 20 02:18:07 2009 +0500
@@ -12,9 +12,10 @@
 local t_remove      =  table.remove;
 local t_concat      =  table.concat;
 local s_format      = string.format;
-local s_match      = string.match;
+local s_match       =  string.match;
 local tostring      =      tostring;
 local setmetatable  =  setmetatable;
+local getmetatable  =  getmetatable;
 local pairs         =         pairs;
 local ipairs        =        ipairs;
 local type          =          type;
@@ -215,6 +216,24 @@
 	return stanza;
 end
 
+function clone(stanza)
+    local lookup_table = {};
+    local function _copy(object)
+        if type(object) ~= "table" then
+            return object;
+        elseif lookup_table[object] then
+            return lookup_table[object];
+        end
+        local new_table = {};
+        lookup_table[object] = new_table;
+        for index, value in pairs(object) do
+            new_table[_copy(index)] = _copy(value);
+        end
+        return setmetatable(new_table, getmetatable(object));
+    end
+    return _copy(stanza)
+end
+
 function message(attr, body)
 	if not body then
 		return stanza("message", attr);

mercurial