'libs/backbone',
 'modules/documentCanvas/canvas/documentElement',
 'modules/documentCanvas/canvas/keyboard',
-'modules/documentCanvas/canvas/utils'
-], function($, _, Backbone, documentElement, keyboard, utils) {
+'modules/documentCanvas/canvas/utils',
+'modules/documentCanvas/canvas/wlxmlListener'
+], function($, _, Backbone, documentElement, keyboard, utils, wlxmlListener) {
     
 'use strict';
 
     this.wrapper = $('<div>').addClass('canvas-wrapper').attr('contenteditable', true);
     this.loadWlxmlDocument(wlxmlDocument);
     this.publisher = publisher ? publisher : function() {};
+    this.wlxmlListener = wlxmlListener.create(this);
 };
 
 $.extend(Canvas.prototype, {
 
     loadWlxmlDocument: function(wlxmlDocument) {
-        wlxmlDocument = wlxmlDocument || this.wlxmlDocument;
         if(!wlxmlDocument) {
             return false;
         }
+
         var canvasDOM = this.generateCanvasDOM(wlxmlDocument.root);
 
         this.wrapper.empty();
         this.d = this.wrapper.children(0);
         this.setupEventHandling();
 
-        var canvas = this;
-
-        if(this.wlxmlDocument !== wlxmlDocument) {
-            wlxmlDocument.on('change', function(event) {
-                var canvasNode = utils.findCanvasElement(event.meta.node);
-                if(event.type === 'nodeAttrChange' && event.meta.attr === 'class') {
-                    canvasNode.setWlxmlClass(event.meta.newVal);
-                }
-
-            });
-        }
-        this.wlxmlDocument = wlxmlDocument;
+        this.wlxmlListener.listenTo(wlxmlDocument);
     },
 
     generateCanvasDOM: function(wlxmlNode) {
 
--- /dev/null
+define([
+'libs/jquery',
+'modules/documentCanvas/canvas/utils',
+], function($, utils) {
+    
+'use strict';
+
+var Listener = function(canvas) {
+    this.canvas = canvas;
+};
+
+$.extend(Listener.prototype, {
+    listenTo: function(wlxmlDocument) {
+        if(wlxmlDocument === this.wlxmlDocument) {
+            return;
+        }
+
+        wlxmlDocument.on('change', function(event) {
+            var handler = handlers[event.type];
+            if(handler) {
+                handler.bind(this)(event);
+            }
+        }, this);
+    }
+});
+
+var handlers = {
+    nodeAttrChange: function(event) {
+        if(event.meta.attr === 'class') {
+            var canvasNode = utils.findCanvasElement(event.meta.node);
+            canvasNode.setWlxmlClass(event.meta.newVal);
+        }
+    }
+};
+
+return {
+    create: function(canvas) {
+        return new Listener(canvas);
+    }
+};
+
+});
\ No newline at end of file