Sat, 20 Jun 2009 12:16:20 +0500
Fire global events using prosody.events
889 | 1 | |
2 | local new_multitable = require "util.multitable".new; | |
3 | local t_insert = table.insert; | |
4 | local t_concat = table.concat; | |
5 | local tostring = tostring; | |
6 | local unpack = unpack; | |
7 | local pairs = pairs; | |
8 | local error = error; | |
9 | local type = type; | |
10 | local _G = _G; | |
11 | ||
12 | local data = new_multitable(); | |
13 | ||
14 | module "objectmanager" | |
15 | ||
16 | function set(...) | |
17 | return data:set(...); | |
18 | end | |
19 | function remove(...) | |
20 | return data:remove(...); | |
21 | end | |
22 | function get(...) | |
23 | return data:get(...); | |
24 | end | |
25 | ||
26 | local function get_path(path) | |
27 | if type(path) == "table" then return path; end | |
28 | local s = {}; | |
29 | for part in tostring(path):gmatch("[%w_]+") do | |
30 | t_insert(s, part); | |
31 | end | |
32 | return s; | |
33 | end | |
34 | ||
35 | function get_object(path) | |
36 | path = get_path(path) | |
37 | return data:get(unpack(path)), path; | |
38 | end | |
39 | function set_object(path, object) | |
40 | path = get_path(path); | |
41 | data:set(unpack(path), object); | |
42 | end | |
43 | ||
44 | data:set("ls", function(_dir) | |
45 | local obj, dir = get_object(_dir); | |
46 | if not obj then error("object not found: " .. t_concat(dir, '/')); end | |
47 | local r = {}; | |
48 | if type(obj) == "table" then | |
49 | for key, val in pairs(obj) do | |
50 | r[key] = type(val); | |
51 | end | |
52 | end | |
53 | return r; | |
54 | end); | |
55 | data:set("get", get_object); | |
56 | data:set("set", set_object); | |
57 | data:set("echo", function(...) return {...}; end); | |
58 | data:set("_G", _G); | |
59 | ||
60 | return _M; |