util/stanza: Added clone function

Fri, 20 Feb 2009 02:18:07 +0500

author
Waqas Hussain <waqas20@gmail.com>
date
Fri, 20 Feb 2009 02:18:07 +0500
changeset 829
b01fd698495e
parent 828
97ea39b7bf90
child 830
c0554caf90e6

util/stanza: Added clone function

util/stanza.lua file | annotate | diff | comparison | revisions
--- 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