refactoring
[fnpeditor.git] / src / smartxml / smartxml.js
index 41e8e19..202d9e6 100644 (file)
@@ -764,6 +764,11 @@ $.extend(Document.prototype, Backbone.Events, {
     },
 
     registerMethod: function(methodName, method) {
+        if(this[methodName]) {
+            throw new Error('Cannot extend document with method name {methodName}. Name already exists.'
+                .replace('{methodName}', methodName)
+            );
+        }
         this[methodName] = method;
     },
 
@@ -772,6 +777,11 @@ $.extend(Document.prototype, Backbone.Events, {
     },
 
     registerNodeMethod: function(methodName, method) {
+        if(this._nodeMethods[methodName]) {
+            throw new Error('Cannot extend document with method name {methodName}. Name already exists.'
+                .replace('{methodName}', methodName)
+            );
+        }
         this._nodeMethods[methodName] = method;
     },
 
@@ -779,6 +789,37 @@ $.extend(Document.prototype, Backbone.Events, {
         this._nodeTransformations.register(Transformation);
     },
 
+    registerExtension: function(extension) {
+        //debugger;
+        var doc = this,
+            existingPropertyNames = _.values(this);
+
+        ['document', 'documentNode'].forEach(function(dstName) {
+            var dstExtension = extension[dstName];
+            if(dstExtension) {
+                if(dstExtension.methods) {
+                    _.pairs(dstExtension.methods).forEach(function(pair) {
+                        var methodName = pair[0],
+                            method = pair[1],
+                            operation;
+                        operation = {document: 'registerMethod', documentNode: 'registerNodeMethod'}[dstName];
+                        doc[operation](methodName, method);
+
+                    });
+                }
+
+                if(dstExtension.transformations) {
+                    _.pairs(dstExtension.transformations).forEach(function(pair) {
+                        var name = pair[0],
+                            desc = pair[1],
+                            operation;
+                        operation = {document: 'registerTransformation', documentNode: 'registerNodeTransformation'}[dstName];
+                        doc[operation](transformations.createContextTransformation(desc, name));
+                    });
+                }
+            }
+        });
+    },
 
     transform: function(transformation, args) {
         //console.log('transform');