1 define(function(require) {
 
   5 var _ = require('libs/underscore'),
 
   8 var getTransDesc = function(desc) {
 
   9     if(typeof desc === 'function') {
 
  13         throw new Error('Got transformation description without implementation.');
 
  18 toret.createGenericTransformation = function(desc, name) {
 
  19     desc = getTransDesc(desc);
 
  21     var GenericTransformation = function(document, args) {
 
  22         this.args = args || [];
 
  24         var transformation = this;
 
  25         // _.keys(this.args).forEach(function(key) {
 
  26         //     if(transformation.args[key].nodeType) { //@@ change to instanceof check, fix circular dependency
 
  27         //         var value = transformation.args[key],
 
  28         //             path = value.getPath();
 
  29         //         Object.defineProperty(transformation.args, key, {
 
  31         //                 if(transformation.hasRun) {
 
  32         //                     //console.log('returning via path');
 
  33         //                     return transformation.document.getNodeByPath(path);
 
  35         //                     //console.log('returning original arg');
 
  44         // potem spr na dotychczasowych undo/redo tests;
 
  47         this.args.forEach(function(arg, idx, args) {
 
  50                 if(arg.nodeType) { // ~
 
  52                     Object.defineProperty(args, idx, {
 
  54                             if(transformation.hasRun && path) {
 
  55                                 return transformation.document.getNodeByPath(path);
 
  61                 } else if(_.isObject(arg)) {
 
  62                     _.keys(arg).forEach(function(key) {
 
  65                         if(value && value.nodeType) {
 
  66                             path = value.getPath();
 
  67                             Object.defineProperty(arg, key, {
 
  69                                     if(transformation.hasRun && path) {
 
  70                                         return transformation.document.getNodeByPath(path);
 
  82         this.document = document;
 
  88     _.extend(GenericTransformation.prototype, {
 
  90         run: function(options) {
 
  92             if(!desc.undo && options.beUndoable) {
 
  93                 changeRoot = this.getChangeRoot();
 
  96                          'Transformation {name} returned invalid change root value'
 
  97                          .replace('{name}', name)
 
 100                 this.changeRootPath = changeRoot.getPath();
 
 101                 this.snapshot = changeRoot.clone();
 
 103             var argsToPass = desc.undo ? [this].concat(this.args) : this.args;
 
 104             var toret = desc.impl.apply(this.context, argsToPass);
 
 110                 desc.undo.call(this.context, this);
 
 112                 this.document.getNodeByPath(this.changeRootPath).replaceWith(this.snapshot);
 
 115         getChangeRoot: desc.getChangeRoot || function() {
 
 116             return this.document.root;
 
 120     return GenericTransformation;
 
 123 toret.createContextTransformation = function(desc, name) {
 
 124     var GenericTransformation = toret.createGenericTransformation(desc, name);
 
 126     var ContextTransformation = function(document, object, args) {
 
 127         GenericTransformation.call(this, document, args);
 
 129         if(document === object) {
 
 130             this.context = document;
 
 132             var contextPath = object.getPath(),
 
 133                 transformation = this;
 
 134             Object.defineProperty(this, 'context', {
 
 136                     if(transformation.hasRun) {
 
 137                         return transformation.document.getNodeByPath(contextPath);
 
 145     ContextTransformation.prototype = Object.create(GenericTransformation.prototype);
 
 146     return ContextTransformation;