86 lines
2.5 KiB
JavaScript
86 lines
2.5 KiB
JavaScript
|
"use strict";
|
||
|
|
||
|
var ModelVocabulary = require("../lib/wModel/vocabulary");
|
||
|
|
||
|
var Vocabulary = require("../lib/wType/vocabulary");
|
||
|
var String = require("../lib/wType/string");
|
||
|
|
||
|
var Commands = ModelVocabulary.inherit({
|
||
|
"className": "Commands",
|
||
|
"constructor": function(address) {
|
||
|
ModelVocabulary.fn.constructor.call(this, address);
|
||
|
|
||
|
this._commands = global.Object.create(null);
|
||
|
},
|
||
|
"destructor": function() {
|
||
|
for (var key in this._commands) {
|
||
|
var cmd = this._commands[key];
|
||
|
if (cmd.enabled) {
|
||
|
this._removeHandler(cmd.handler);
|
||
|
}
|
||
|
cmd.name.destructor();
|
||
|
cmd.handler.destructor();
|
||
|
cmd.arguments.destructor();
|
||
|
delete this._commands[key];
|
||
|
}
|
||
|
|
||
|
ModelVocabulary.fn.destructor.call(this);
|
||
|
},
|
||
|
"addCommand": function(key, handler, args) {
|
||
|
if (this._commands[key]) {
|
||
|
throw new Error("Command with this key already exist");
|
||
|
}
|
||
|
this._commands[key] = {
|
||
|
name: new String(key),
|
||
|
handler: handler,
|
||
|
arguments: args,
|
||
|
enabled: false
|
||
|
}
|
||
|
},
|
||
|
"_disableCommand": function(cmd) {
|
||
|
this._removeHandler(cmd.handler);
|
||
|
cmd.enabled = false;
|
||
|
this.erase(cmd.name.toString());
|
||
|
},
|
||
|
"enableCommand": function(key, value) {
|
||
|
var cmd = this._commands[key];
|
||
|
|
||
|
if (!cmd) {
|
||
|
throw new Error("An attempt to access non existing command: " + key);
|
||
|
}
|
||
|
|
||
|
if (cmd.enabled !== value) {
|
||
|
if (value) {
|
||
|
this._enableCommand(cmd);
|
||
|
} else {
|
||
|
this._disableCommand(cmd);
|
||
|
}
|
||
|
}
|
||
|
},
|
||
|
"_enableCommand": function(cmd) {
|
||
|
this._addHandler(cmd.handler);
|
||
|
cmd.enabled = true;
|
||
|
|
||
|
var vc = new Vocabulary();
|
||
|
vc.insert("address", cmd.handler.address.clone());
|
||
|
vc.insert("arguments", cmd.arguments.clone());
|
||
|
|
||
|
this.insert(cmd.name.toString(), vc);
|
||
|
},
|
||
|
"removeCommand": function(name) {
|
||
|
var cmd = this._commands[name];
|
||
|
if (cmd === undefined) {
|
||
|
throw new Error("An attempt to access non existing command: " + key);
|
||
|
}
|
||
|
if (cmd.enabled) {
|
||
|
this._disableCommand(cmd);
|
||
|
}
|
||
|
cmd.name.destructor();
|
||
|
cmd.handler.destructor();
|
||
|
cmd.arguments.destructor();
|
||
|
delete this._commands[name];
|
||
|
}
|
||
|
});
|
||
|
|
||
|
module.exports = Commands;
|