14 Commits ea3e8cc6c7 ... 356cc0f13c

Author SHA1 Message Date
  Herbert Vojčík 356cc0f13c Fix README. 6 years ago
  Herbert Vojčík 093271d83d Trapped-Frontend => Trapped 6 years ago
  Herbert Vojčík 7d4d0cc909 Isolator->Axxord; Backend,Tests empty, deleted. 6 years ago
  Herbert Vojčík f76ef11509 Move TrappedPosition into Trapped-Frontend. 6 years ago
  Herbert Vojčík 5190cd1add Move Interested...Axes into Axxord. 6 years ago
  Herbert Vojčík 5470664f1d Remove old relic. 6 years ago
  Herbert Vojčík 8e16c43c2d Fix .gitignore. 6 years ago
  Herbert Vojčík 991fac4c1d Fix frontend imports. 6 years ago
  Herbert Vojčík 48ad567b66 Compile examples as well in `grunt`. 6 years ago
  Herbert Vojčík f01aa1d1b0 Clean old things. 6 years ago
  Herbert Vojčík fe1480e9b1 Use Axxord-based blackboard. 6 years ago
  Herbert Vojčík effeebb3fd Add imports to the example. 6 years ago
  Herbert Vojčík 46eca3206f Use Axxord-based blackboard. 6 years ago
  Herbert Vojčík 6619e9b8e0 Stop using Trapper, start using Axxord. 6 years ago

+ 2 - 0
.gitignore

@@ -1,6 +1,8 @@
 /node_modules/
 /bower_components/
 
+/my/
+
 /test_runner.js
 
 /config.js

+ 0 - 8
.idea/runConfigurations/Amber_server.xml

@@ -1,8 +0,0 @@
-<component name="ProjectRunConfigurationManager">
-  <configuration default="false" name="Amber server" type="NodeJSConfigurationType" factoryName="Node.js" path-to-node="C:/Program Files/nodejs/node" path-to-js-file="bower_components/amber/cli/support/amber-cli.js" application-parameters="serve" working-dir="$PROJECT_DIR$">
-    <browser start="false" url="" with-js-debugger="false" />
-    <RunnerSettings RunnerId="NodeJS.run" />
-    <ConfigurationWrapper RunnerId="NodeJS.run" />
-    <method />
-  </configuration>
-</component>

+ 6 - 22
Gruntfile.js

@@ -11,7 +11,7 @@ module.exports = function (grunt) {
         helpers = require('amber-dev').helpers;
 
     // Default task.
-    grunt.registerTask('default', ['amdconfig:app', 'amberc:axon', 'amberc:alybaba', 'amberc:all']);
+    grunt.registerTask('default', ['amdconfig:app', 'amberc:all', 'amberc:counter', 'amberc:todo']);
     grunt.registerTask('test', ['amdconfig:app', 'requirejs:test_runner', 'exec:test_runner', 'clean:test_runner']);
     grunt.registerTask('devel', ['amdconfig:app', 'requirejs:devel']);
     grunt.registerTask('deploy', ['amdconfig:app', 'requirejs:deploy']);
@@ -39,43 +39,27 @@ module.exports = function (grunt) {
                 amber_dir: path.join(__dirname, "bower_components", "amber"),
                 configFile: "config.js"
             },
-            axon: {
-                src: [
-                    'src/Axon.st',  // list all sources in dependency order
-                    // list all tests in dependency order
-                ],
-                amd_namespace: 'axon',
-                libraries: ['amber_core/SUnit']
-            },
             all: {
                 src: [
-                    'src/Trapped-Backend.st', 'src/Trapped-Frontend.st', 'src/Trapped-Processors.st', // list all sources in dependency order
-                    'src/Trapped-Tests.st' // list all tests in dependency order
-                ],
-                amd_namespace: 'trapped',
-                libraries: ['axon/Axon', 'amber_core/SUnit', 'amber/web/Web']
-            },
-            alybaba: {
-                src: [
-                    'src/Alybaba.st',  // list all sources in dependency order
+                    'src/Trapped-Frontend.st', 'src/Trapped-Processors.st', // list all sources in dependency order
                     // list all tests in dependency order
                 ],
-                amd_namespace: 'alybaba',
-                libraries: ['amber_core/SUnit']
+                amd_namespace: 'trapped',
+                libraries: ['axxord/Axxord', 'amber_core/SUnit', 'amber/web/Web']
             },
             counter: {
                 src: [
                     'example-counter/src/Trapped-Counter.st'
                 ],
                 amd_namespace: 'trapped-counter',
-                libraries: ['amber_core/SUnit', 'amber/web/Web', 'trapped/Trapped-Backend']
+                libraries: ['amber_core/SUnit', 'amber/web/Web', 'axxord/Axxord']
             },
             todo: {
                 src: [
                     'example-todo/src/Trapped-Todo.st'
                 ],
                 amd_namespace: 'trapped-todo',
-                libraries: ['amber_core/SUnit', 'amber/web/Web', 'trapped/Trapped-Frontend', 'trapped/Trapped-Backend']
+                libraries: ['amber_core/SUnit', 'amber/web/Web', 'trapped/Trapped-Frontend']
             }
         },
 

+ 15 - 13
README.md

@@ -46,28 +46,30 @@ the _Model_ just observe and manipulate contents of the _ViewModel_.
 
 More precisely:
 
-1. You provide the class for _ViewModel_ data (`AppModel` in the examples).
-You can build it any way you wish, it has to be able to hold all the data
-_ViewModel_ may need to hold. It can also hold some methods for manipulation
-of these data, which is good for the example, but in real project
-this should be the responsibility of _Model_.
-1. You create the class for _ViewModel_ itself (`App` in the examples).
-This is more or less mechanical task - just create subclass of right
-base class and fill in `initialize` method appropriately, so that
-it wraps the real data (instance of the class from previous paragraph).
-This wrapper class implement the _blackboard_ pattern -
-in which many external observers (called specialists)
-observe the data object (called blackboard),
+1. You provide the class for _ViewModel_ (`TrappedCounter` / `TrappedTodo`
+in the examples). You can build it any way you wish, it has to be able to hold
+all the data _ViewModel_ may need to hold. It can also hold some methods
+for manipulation of these data, which is good for the example, but
+in real project this should be the responsibility of _Model_.
+1. In `initialize`, you should register an `Axon` into _ViewModel_ instance.
+It implements the _blackboard_ pattern - in which many external observers
+(called specialists) observe the data object (called blackboard),
 make partial changes and react to them. Elements of _View_
 are observers of the _ViewModel_ blackboard, as should
 be the parts of the _Model_ (this way, _Model_ and _View_
 are completely decoupled and both see only changes
 to the blackboard, that is, the _ViewModel_).
+In Todo example, one trivial specialist is created as well,
+which observes for changes in todos and updates their remaining number.
+In real world, it should be in _Model_ with other specialists.
 1. You write HTML and annotate the elements
 with the data-binding expressions (attribute `data-trap`)
 in which you describe what data to bind to (_path_)
 and how to process it in the way to the user or from the user
 (_processors_).
+1. Since you will likely use some non-trivial processors in HTML,
+(or in code via API which is also possible), your app package
+should import 'trapped/Trapped-Processors'.
 1. When initializing the page, you must call `Trapped start: anArray`
 where _anArray_ should contain instances of all blackboards (most often
 you will only have one, `blackboard` in the examples)
@@ -272,7 +274,7 @@ are instances of some subclass of `TrappedProcessor`.
 
 Basic processor _contents_ which is used as a default
 when no processing chain is specified, is contained within
-`Trapped-Frontend` package; all the other processors supplied
+`Trapped` package; all the other processors supplied
 by Trapped which will be described later, are contained
  in `Trapped-Processors` package. If you look at the factory
  (`TrappedProcessor class`), you see that their factory methods

+ 0 - 1
deploy.js

@@ -1,7 +1,6 @@
 define([
     'amber/deploy',
     // --- packages to be deployed begin here ---
-    "trapped/Trapped-Backend",
     "trapped/Trapped-Processors"
     // --- packages to be deployed end here ---
 ], function (amber) {

+ 1 - 0
devel.js

@@ -2,6 +2,7 @@ define([
     './testing',
     'amber/devel',
     // --- packages used only during development begin here ---
+    'axxord/Axxord-Tests',
     'amber/legacy/IDE'
     // --- packages used only during development end here ---
 ], function (amber) {

+ 4 - 4
example-counter/counter.html

@@ -25,7 +25,7 @@
                     require(["amber-ide-starter-dialog"], function (dlg) { dlg.start(); });
 
                     $(function () {
-                        blackboard = amber.globals.App._new();
+                        blackboard = amber.globals.TrappedCounter._new();
                         amber.globals.Trapped._start_([blackboard]);
                     });
                 });
@@ -34,8 +34,8 @@
     </script>
 </head>
 <body>
-<h2 data-trap="App ~value"></h2>
-<button data-trap="App: (signal increment) whenClicked">++</button>
-<button data-trap="App: (signal decrement) whenClicked">--</button>
+<h2 data-trap="TrappedCounter ~value"></h2>
+<button data-trap="TrappedCounter: (signal increment) whenClicked">++</button>
+<button data-trap="TrappedCounter: (signal decrement) whenClicked">--</button>
 </body>
 </html>

+ 24 - 58
example-counter/src/Trapped-Counter.js

@@ -1,57 +1,22 @@
-define(["amber/boot", "amber_core/Kernel-Objects", "trapped/Trapped-Backend"], function($boot){"use strict";
+define(["amber/boot"
+//>>excludeStart("imports", pragmas.excludeImports);
+, "trapped/Trapped-Processors"
+//>>excludeEnd("imports");
+, "amber_core/Kernel-Objects"], function($boot
+//>>excludeStart("imports", pragmas.excludeImports);
+
+//>>excludeEnd("imports");
+){"use strict";
 if(!$boot.nilAsReceiver)$boot.nilAsReceiver=$boot.nil;
 if(!("nilAsValue" in $boot))$boot.nilAsValue=$boot.nilAsReceiver;
 var $core=$boot.api,nil=$boot.nilAsValue,$nil=$boot.nilAsReceiver,$recv=$boot.asReceiver,$globals=$boot.globals;
 if(!$boot.nilAsClass)$boot.nilAsClass=$boot.dnu;
 $core.addPackage("Trapped-Counter");
 $core.packages["Trapped-Counter"].innerEval = function (expr) { return eval(expr); };
+$core.packages["Trapped-Counter"].imports = ["trapped/Trapped-Processors"];
 $core.packages["Trapped-Counter"].transport = {"type":"amd","amdNamespace":"trapped-counter"};
 
-$core.addClass("App", $globals.DirectTrapper, [], "Trapped-Counter");
-//>>excludeStart("ide", pragmas.excludeIdeData);
-$globals.App.comment="// Code from AngularJS Todo example, http://angularjs.org/#todo-js\x0afunction TodoCtrl($scope) {\x0a  $scope.todos = [\x0a    {text:'learn angular', done:true},\x0a    {text:'build an angular app', done:false}];\x0a \x0a  $scope.addTodo = function() {\x0a    $scope.todos.push({text:$scope.todoText, done:false});\x0a    $scope.todoText = '';\x0a  };\x0a \x0a  $scope.remaining = function() {\x0a    var count = 0;\x0a    angular.forEach($scope.todos, function(todo) {\x0a      count += todo.done ? 0 : 1;\x0a    });\x0a    return count;\x0a  };\x0a \x0a  $scope.archive = function() {\x0a    var oldTodos = $scope.todos;\x0a    $scope.todos = [];\x0a    angular.forEach(oldTodos, function(todo) {\x0a      if (!todo.done) $scope.todos.push(todo);\x0a    });\x0a  };\x0a}";
-//>>excludeEnd("ide");
-$core.addMethod(
-$core.method({
-selector: "initialize",
-protocol: "initialization",
-fn: function (){
-var self=this,$self=this;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-return $core.withContext(function($ctx1) {
-//>>excludeEnd("ctx");
-var $1;
-(
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-$ctx1.supercall = true,
-//>>excludeEnd("ctx");
-($globals.App.superclass||$boot.nilAsClass).fn.prototype._initialize.apply($self, []));
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-$ctx1.supercall = false;
-//>>excludeEnd("ctx");;
-$1=$recv($globals.SimpleAxon)._new();
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-$ctx1.sendIdx["new"]=1;
-//>>excludeEnd("ctx");
-$self._axon_($1);
-$self._model_($recv($globals.AppModel)._new());
-return self;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx1) {$ctx1.fill(self,"initialize",{},$globals.App)});
-//>>excludeEnd("ctx");
-},
-//>>excludeStart("ide", pragmas.excludeIdeData);
-args: [],
-source: "initialize\x0a\x09super initialize.\x0a    self axon: SimpleAxon new.\x0a    self model: AppModel new",
-referencedClasses: ["SimpleAxon", "AppModel"],
-//>>excludeEnd("ide");
-messageSends: ["initialize", "axon:", "new", "model:"]
-}),
-$globals.App);
-
-
-
-$core.addClass("AppModel", $globals.Object, ["value"], "Trapped-Counter");
+$core.addClass("TrappedCounter", $globals.Object, ["value"], "Trapped-Counter");
 $core.addMethod(
 $core.method({
 selector: "decrement",
@@ -64,7 +29,7 @@ return $core.withContext(function($ctx1) {
 $self["@value"]=$recv($self["@value"]).__minus((1));
 return self;
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx1) {$ctx1.fill(self,"decrement",{},$globals.AppModel)});
+}, function($ctx1) {$ctx1.fill(self,"decrement",{},$globals.TrappedCounter)});
 //>>excludeEnd("ctx");
 },
 //>>excludeStart("ide", pragmas.excludeIdeData);
@@ -74,7 +39,7 @@ referencedClasses: [],
 //>>excludeEnd("ide");
 messageSends: ["-"]
 }),
-$globals.AppModel);
+$globals.TrappedCounter);
 
 $core.addMethod(
 $core.method({
@@ -88,7 +53,7 @@ return $core.withContext(function($ctx1) {
 $self["@value"]=$recv($self["@value"]).__plus((1));
 return self;
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx1) {$ctx1.fill(self,"increment",{},$globals.AppModel)});
+}, function($ctx1) {$ctx1.fill(self,"increment",{},$globals.TrappedCounter)});
 //>>excludeEnd("ctx");
 },
 //>>excludeStart("ide", pragmas.excludeIdeData);
@@ -98,7 +63,7 @@ referencedClasses: [],
 //>>excludeEnd("ide");
 messageSends: ["+"]
 }),
-$globals.AppModel);
+$globals.TrappedCounter);
 
 $core.addMethod(
 $core.method({
@@ -113,24 +78,25 @@ return $core.withContext(function($ctx1) {
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
 $ctx1.supercall = true,
 //>>excludeEnd("ctx");
-($globals.AppModel.superclass||$boot.nilAsClass).fn.prototype._initialize.apply($self, []));
+($globals.TrappedCounter.superclass||$boot.nilAsClass).fn.prototype._initialize.apply($self, []));
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
 $ctx1.supercall = false;
 //>>excludeEnd("ctx");;
+$recv($recv($globals.SimpleAxon)._new())._registerIn_(self);
 $self["@value"]=(0);
 return self;
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx1) {$ctx1.fill(self,"initialize",{},$globals.AppModel)});
+}, function($ctx1) {$ctx1.fill(self,"initialize",{},$globals.TrappedCounter)});
 //>>excludeEnd("ctx");
 },
 //>>excludeStart("ide", pragmas.excludeIdeData);
 args: [],
-source: "initialize\x0a\x09super initialize.\x0a\x09value := 0",
-referencedClasses: [],
+source: "initialize\x0a\x09super initialize.\x0a\x09SimpleAxon new registerIn: self.\x0a\x09value := 0",
+referencedClasses: ["SimpleAxon"],
 //>>excludeEnd("ide");
-messageSends: ["initialize"]
+messageSends: ["initialize", "registerIn:", "new"]
 }),
-$globals.AppModel);
+$globals.TrappedCounter);
 
 $core.addMethod(
 $core.method({
@@ -148,7 +114,7 @@ referencedClasses: [],
 //>>excludeEnd("ide");
 messageSends: []
 }),
-$globals.AppModel);
+$globals.TrappedCounter);
 
 $core.addMethod(
 $core.method({
@@ -167,7 +133,7 @@ referencedClasses: [],
 //>>excludeEnd("ide");
 messageSends: []
 }),
-$globals.AppModel);
+$globals.TrappedCounter);
 
 
 });

+ 6 - 44
example-counter/src/Trapped-Counter.st

@@ -1,49 +1,10 @@
 Smalltalk createPackage: 'Trapped-Counter'!
-DirectTrapper subclass: #App
-	instanceVariableNames: ''
-	package: 'Trapped-Counter'!
-!App commentStamp!
-// Code from AngularJS Todo example, http://angularjs.org/#todo-js
-function TodoCtrl($scope) {
-  $scope.todos = [
-    {text:'learn angular', done:true},
-    {text:'build an angular app', done:false}];
- 
-  $scope.addTodo = function() {
-    $scope.todos.push({text:$scope.todoText, done:false});
-    $scope.todoText = '';
-  };
- 
-  $scope.remaining = function() {
-    var count = 0;
-    angular.forEach($scope.todos, function(todo) {
-      count += todo.done ? 0 : 1;
-    });
-    return count;
-  };
- 
-  $scope.archive = function() {
-    var oldTodos = $scope.todos;
-    $scope.todos = [];
-    angular.forEach(oldTodos, function(todo) {
-      if (!!todo.done) $scope.todos.push(todo);
-    });
-  };
-}!
-
-!App methodsFor: 'initialization'!
-
-initialize
-	super initialize.
-    self axon: SimpleAxon new.
-    self model: AppModel new
-! !
-
-Object subclass: #AppModel
+(Smalltalk packageAt: 'Trapped-Counter') imports: {'trapped/Trapped-Processors'}!
+Object subclass: #TrappedCounter
 	instanceVariableNames: 'value'
 	package: 'Trapped-Counter'!
 
-!AppModel methodsFor: 'accessing'!
+!TrappedCounter methodsFor: 'accessing'!
 
 value
 	^value
@@ -53,7 +14,7 @@ value: aNumber
 	value := aNumber
 ! !
 
-!AppModel methodsFor: 'action'!
+!TrappedCounter methodsFor: 'action'!
 
 decrement
 	value := value - 1
@@ -63,10 +24,11 @@ increment
 	value := value + 1
 ! !
 
-!AppModel methodsFor: 'initialization'!
+!TrappedCounter methodsFor: 'initialization'!
 
 initialize
 	super initialize.
+	SimpleAxon new registerIn: self.
 	value := 0
 ! !
 

+ 79 - 82
example-todo/src/Trapped-Todo.js

@@ -1,134 +1,131 @@
-define(["amber/boot", "amber_core/Kernel-Objects", "trapped/Trapped-Backend", "trapped/Trapped-Frontend"], function($boot){"use strict";
+define(["amber/boot"
+//>>excludeStart("imports", pragmas.excludeImports);
+, "trapped/Trapped-Processors"
+//>>excludeEnd("imports");
+, "amber_core/Kernel-Objects", "trapped/Trapped"], function($boot
+//>>excludeStart("imports", pragmas.excludeImports);
+
+//>>excludeEnd("imports");
+){"use strict";
 if(!$boot.nilAsReceiver)$boot.nilAsReceiver=$boot.nil;
 if(!("nilAsValue" in $boot))$boot.nilAsValue=$boot.nilAsReceiver;
 var $core=$boot.api,nil=$boot.nilAsValue,$nil=$boot.nilAsReceiver,$recv=$boot.asReceiver,$globals=$boot.globals;
 if(!$boot.nilAsClass)$boot.nilAsClass=$boot.dnu;
 $core.addPackage("Trapped-Todo");
 $core.packages["Trapped-Todo"].innerEval = function (expr) { return eval(expr); };
+$core.packages["Trapped-Todo"].imports = ["trapped/Trapped-Processors"];
 $core.packages["Trapped-Todo"].transport = {"type":"amd","amdNamespace":"trapped-todo"};
 
-$core.addClass("App", $globals.IsolatingTrapper, [], "Trapped-Todo");
+$core.addClass("TrappedTodo", $globals.Object, ["title", "todos", "todoText"], "Trapped-Todo");
 //>>excludeStart("ide", pragmas.excludeIdeData);
-$globals.App.comment="// Code from AngularJS Todo example, http://angularjs.org/#todo-js\x0afunction TodoCtrl($scope) {\x0a  $scope.todos = [\x0a    {text:'learn angular', done:true},\x0a    {text:'build an angular app', done:false}];\x0a \x0a  $scope.addTodo = function() {\x0a    $scope.todos.push({text:$scope.todoText, done:false});\x0a    $scope.todoText = '';\x0a  };\x0a \x0a  $scope.remaining = function() {\x0a    var count = 0;\x0a    angular.forEach($scope.todos, function(todo) {\x0a      count += todo.done ? 0 : 1;\x0a    });\x0a    return count;\x0a  };\x0a \x0a  $scope.archive = function() {\x0a    var oldTodos = $scope.todos;\x0a    $scope.todos = [];\x0a    angular.forEach(oldTodos, function(todo) {\x0a      if (!todo.done) $scope.todos.push(todo);\x0a    });\x0a  };\x0a}";
+$globals.TrappedTodo.comment="// Code from AngularJS Todo example, http://angularjs.org/#todo-js\x0afunction TodoCtrl($scope) {\x0a  $scope.todos = [\x0a    {text:'learn angular', done:true},\x0a    {text:'build an angular app', done:false}];\x0a \x0a  $scope.addTodo = function() {\x0a    $scope.todos.push({text:$scope.todoText, done:false});\x0a    $scope.todoText = '';\x0a  };\x0a \x0a  $scope.remaining = function() {\x0a    var count = 0;\x0a    angular.forEach($scope.todos, function(todo) {\x0a      count += todo.done ? 0 : 1;\x0a    });\x0a    return count;\x0a  };\x0a \x0a  $scope.archive = function() {\x0a    var oldTodos = $scope.todos;\x0a    $scope.todos = [];\x0a    angular.forEach(oldTodos, function(todo) {\x0a      if (!todo.done) $scope.todos.push(todo);\x0a    });\x0a  };\x0a}";
 //>>excludeEnd("ide");
 $core.addMethod(
 $core.method({
-selector: "initialize",
-protocol: "initialization",
+selector: "addTodo",
+protocol: "action",
 fn: function (){
 var self=this,$self=this;
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
 return $core.withContext(function($ctx1) {
 //>>excludeEnd("ctx");
-var $1,$3,$2;
-(
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-$ctx1.supercall = true,
-//>>excludeEnd("ctx");
-($globals.App.superclass||$boot.nilAsClass).fn.prototype._initialize.apply($self, []));
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-$ctx1.supercall = false;
-//>>excludeEnd("ctx");;
-$1=$recv($globals.SimpleAxon)._new();
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-$ctx1.sendIdx["new"]=1;
-//>>excludeEnd("ctx");
-$self._axon_($1);
-$3=$recv($globals.AppModel)._new();
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-$ctx1.sendIdx["new"]=2;
-//>>excludeEnd("ctx");
-$2=$recv($3)._title_("Todo");
-$self._model_($2);
-$recv($self._axon())._addInterest_($recv($recv($globals.InterestedInTrapPathSubtree)._new())._aspect_block_([["todos"]],(function(){
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-return $core.withContext(function($ctx2) {
-//>>excludeEnd("ctx");
-return $self._changed_([["remaining"]]);
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx2) {$ctx2.fillBlock({},$ctx1,1)});
-//>>excludeEnd("ctx");
-})));
-$recv((function(){
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-return $core.withContext(function($ctx2) {
-//>>excludeEnd("ctx");
-return $self._modify_do_([["todos"]],(function(){
-return [$globals.HashedCollection._newFromPairs_(["text","learn trapped","done",true]),$globals.HashedCollection._newFromPairs_(["text","build a trapped app","done",false])];
-
-}));
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx2) {$ctx2.fillBlock({},$ctx1,2)});
-//>>excludeEnd("ctx");
-}))._valueWithTimeout_((2000));
+$recv($self._todos())._add_($globals.HashedCollection._newFromPairs_(["text",$self._todoText(),"done",false]));
+$self._todoText_("");
 return self;
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx1) {$ctx1.fill(self,"initialize",{},$globals.App)});
+}, function($ctx1) {$ctx1.fill(self,"addTodo",{},$globals.TrappedTodo)});
 //>>excludeEnd("ctx");
 },
 //>>excludeStart("ide", pragmas.excludeIdeData);
 args: [],
-source: "initialize\x0a\x09super initialize.\x0a    self axon: SimpleAxon new.\x0a    self model: (AppModel new title: 'Todo').\x0a\x09self axon addInterest: (\x0a\x09\x09InterestedInTrapPathSubtree new\x0a\x09\x09\x09aspect: #((todos))\x0a\x09\x09\x09block: [ self changed: #((remaining)) ]).\x0a    [ self modify: #((todos)) do: [{\x0a        #{'text'->'learn trapped'. 'done'->true}.\x0a        #{'text'->'build a trapped app'. 'done'->false}\x0a    }]] valueWithTimeout: 2000",
-referencedClasses: ["SimpleAxon", "AppModel", "InterestedInTrapPathSubtree"],
+source: "addTodo\x0a    self todos add: #{'text'->self todoText. 'done'->false}.\x0a    self todoText: ''",
+referencedClasses: [],
 //>>excludeEnd("ide");
-messageSends: ["initialize", "axon:", "new", "model:", "title:", "addInterest:", "axon", "aspect:block:", "changed:", "valueWithTimeout:", "modify:do:"]
+messageSends: ["add:", "todos", "todoText", "todoText:"]
 }),
-$globals.App);
-
-
+$globals.TrappedTodo);
 
-$core.addClass("AppModel", $globals.Object, ["title", "todos", "todoText"], "Trapped-Todo");
-//>>excludeStart("ide", pragmas.excludeIdeData);
-$globals.AppModel.comment="// Code from AngularJS Todo example, http://angularjs.org/#todo-js\x0afunction TodoCtrl($scope) {\x0a  $scope.todos = [\x0a    {text:'learn angular', done:true},\x0a    {text:'build an angular app', done:false}];\x0a \x0a  $scope.addTodo = function() {\x0a    $scope.todos.push({text:$scope.todoText, done:false});\x0a    $scope.todoText = '';\x0a  };\x0a \x0a  $scope.remaining = function() {\x0a    var count = 0;\x0a    angular.forEach($scope.todos, function(todo) {\x0a      count += todo.done ? 0 : 1;\x0a    });\x0a    return count;\x0a  };\x0a \x0a  $scope.archive = function() {\x0a    var oldTodos = $scope.todos;\x0a    $scope.todos = [];\x0a    angular.forEach(oldTodos, function(todo) {\x0a      if (!todo.done) $scope.todos.push(todo);\x0a    });\x0a  };\x0a}";
-//>>excludeEnd("ide");
 $core.addMethod(
 $core.method({
-selector: "addTodo",
+selector: "archive",
 protocol: "action",
 fn: function (){
 var self=this,$self=this;
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
 return $core.withContext(function($ctx1) {
 //>>excludeEnd("ctx");
-$recv($self._todos())._add_($globals.HashedCollection._newFromPairs_(["text",$self._todoText(),"done",false]));
-$self._todoText_("");
+$self._todos_($self._todosNotDone());
 return self;
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx1) {$ctx1.fill(self,"addTodo",{},$globals.AppModel)});
+}, function($ctx1) {$ctx1.fill(self,"archive",{},$globals.TrappedTodo)});
 //>>excludeEnd("ctx");
 },
 //>>excludeStart("ide", pragmas.excludeIdeData);
 args: [],
-source: "addTodo\x0a    self todos add: #{'text'->self todoText. 'done'->false}.\x0a    self todoText: ''",
+source: "archive\x0a    self todos: self todosNotDone",
 referencedClasses: [],
 //>>excludeEnd("ide");
-messageSends: ["add:", "todos", "todoText", "todoText:"]
+messageSends: ["todos:", "todosNotDone"]
 }),
-$globals.AppModel);
+$globals.TrappedTodo);
 
 $core.addMethod(
 $core.method({
-selector: "archive",
-protocol: "action",
+selector: "initialize",
+protocol: "initialization",
 fn: function (){
 var self=this,$self=this;
+var axon;
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
 return $core.withContext(function($ctx1) {
 //>>excludeEnd("ctx");
-$self._todos_($self._todosNotDone());
+(
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+$ctx1.supercall = true,
+//>>excludeEnd("ctx");
+($globals.TrappedTodo.superclass||$boot.nilAsClass).fn.prototype._initialize.apply($self, []));
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+$ctx1.supercall = false;
+//>>excludeEnd("ctx");;
+axon=$recv($globals.SimpleAxon)._new();
+$recv(axon)._registerIn_(self);
+$recv(axon)._addInterest_($recv($globals.TrappedPosition)._interestOn_block_([["todos"], nil],(function(){
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+return $core.withContext(function($ctx2) {
+//>>excludeEnd("ctx");
+return $recv(axon)._changed_([["remaining"]]);
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+}, function($ctx2) {$ctx2.fillBlock({},$ctx1,1)});
+//>>excludeEnd("ctx");
+})));
+$recv((function(){
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+return $core.withContext(function($ctx2) {
+//>>excludeEnd("ctx");
+return $self._axes_transform_([["todos"]],(function(){
+return [$globals.HashedCollection._newFromPairs_(["text","learn trapped","done",true]),$globals.HashedCollection._newFromPairs_(["text","build a trapped app","done",false])];
+
+}));
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+}, function($ctx2) {$ctx2.fillBlock({},$ctx1,2)});
+//>>excludeEnd("ctx");
+}))._valueWithTimeout_((2000));
+$self["@title"]="Todo";
+$self["@todoText"]=nil;
+$self["@todos"]=nil;
 return self;
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx1) {$ctx1.fill(self,"archive",{},$globals.AppModel)});
+}, function($ctx1) {$ctx1.fill(self,"initialize",{axon:axon},$globals.TrappedTodo)});
 //>>excludeEnd("ctx");
 },
 //>>excludeStart("ide", pragmas.excludeIdeData);
 args: [],
-source: "archive\x0a    self todos: self todosNotDone",
-referencedClasses: [],
+source: "initialize\x0a\x09| axon |\x0a\x09super initialize.\x0a\x0a    axon := SimpleAxon new.\x0a\x09axon registerIn: self.\x0a\x09\x0a\x09axon addInterest: (TrappedPosition\x0a\x09\x09interestOn: #((todos) nil)\x0a\x09\x09block: [ axon changed: #((remaining)) ]).\x0a\x0a    [ self axes: #((todos)) transform: [{\x0a        #{'text'->'learn trapped'. 'done'->true}.\x0a        #{'text'->'build a trapped app'. 'done'->false}\x0a    }]] valueWithTimeout: 2000.\x0a\x0a\x09title := 'Todo'.\x0a\x09todoText := nil.\x0a\x09todos := nil",
+referencedClasses: ["SimpleAxon", "TrappedPosition"],
 //>>excludeEnd("ide");
-messageSends: ["todos:", "todosNotDone"]
+messageSends: ["initialize", "new", "registerIn:", "addInterest:", "interestOn:block:", "changed:", "valueWithTimeout:", "axes:transform:"]
 }),
-$globals.AppModel);
+$globals.TrappedTodo);
 
 $core.addMethod(
 $core.method({
@@ -141,7 +138,7 @@ return $core.withContext(function($ctx1) {
 //>>excludeEnd("ctx");
 return $recv($self._todosNotDone())._size();
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx1) {$ctx1.fill(self,"remaining",{},$globals.AppModel)});
+}, function($ctx1) {$ctx1.fill(self,"remaining",{},$globals.TrappedTodo)});
 //>>excludeEnd("ctx");
 },
 //>>excludeStart("ide", pragmas.excludeIdeData);
@@ -151,7 +148,7 @@ referencedClasses: [],
 //>>excludeEnd("ide");
 messageSends: ["size", "todosNotDone"]
 }),
-$globals.AppModel);
+$globals.TrappedTodo);
 
 $core.addMethod(
 $core.method({
@@ -169,7 +166,7 @@ referencedClasses: [],
 //>>excludeEnd("ide");
 messageSends: []
 }),
-$globals.AppModel);
+$globals.TrappedTodo);
 
 $core.addMethod(
 $core.method({
@@ -188,7 +185,7 @@ referencedClasses: [],
 //>>excludeEnd("ide");
 messageSends: []
 }),
-$globals.AppModel);
+$globals.TrappedTodo);
 
 $core.addMethod(
 $core.method({
@@ -206,7 +203,7 @@ referencedClasses: [],
 //>>excludeEnd("ide");
 messageSends: []
 }),
-$globals.AppModel);
+$globals.TrappedTodo);
 
 $core.addMethod(
 $core.method({
@@ -225,7 +222,7 @@ referencedClasses: [],
 //>>excludeEnd("ide");
 messageSends: []
 }),
-$globals.AppModel);
+$globals.TrappedTodo);
 
 $core.addMethod(
 $core.method({
@@ -243,7 +240,7 @@ referencedClasses: [],
 //>>excludeEnd("ide");
 messageSends: []
 }),
-$globals.AppModel);
+$globals.TrappedTodo);
 
 $core.addMethod(
 $core.method({
@@ -262,7 +259,7 @@ referencedClasses: [],
 //>>excludeEnd("ide");
 messageSends: []
 }),
-$globals.AppModel);
+$globals.TrappedTodo);
 
 $core.addMethod(
 $core.method({
@@ -283,7 +280,7 @@ return $recv(each)._at_("done");
 //>>excludeEnd("ctx");
 }));
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx1) {$ctx1.fill(self,"todosNotDone",{},$globals.AppModel)});
+}, function($ctx1) {$ctx1.fill(self,"todosNotDone",{},$globals.TrappedTodo)});
 //>>excludeEnd("ctx");
 },
 //>>excludeStart("ide", pragmas.excludeIdeData);
@@ -293,7 +290,7 @@ referencedClasses: [],
 //>>excludeEnd("ide");
 messageSends: ["reject:", "todos", "at:"]
 }),
-$globals.AppModel);
+$globals.TrappedTodo);
 
 
 $core.addMethod(

+ 28 - 52
example-todo/src/Trapped-Todo.st

@@ -1,56 +1,9 @@
 Smalltalk createPackage: 'Trapped-Todo'!
-IsolatingTrapper subclass: #App
-	instanceVariableNames: ''
-	package: 'Trapped-Todo'!
-!App commentStamp!
-// Code from AngularJS Todo example, http://angularjs.org/#todo-js
-function TodoCtrl($scope) {
-  $scope.todos = [
-    {text:'learn angular', done:true},
-    {text:'build an angular app', done:false}];
- 
-  $scope.addTodo = function() {
-    $scope.todos.push({text:$scope.todoText, done:false});
-    $scope.todoText = '';
-  };
- 
-  $scope.remaining = function() {
-    var count = 0;
-    angular.forEach($scope.todos, function(todo) {
-      count += todo.done ? 0 : 1;
-    });
-    return count;
-  };
- 
-  $scope.archive = function() {
-    var oldTodos = $scope.todos;
-    $scope.todos = [];
-    angular.forEach(oldTodos, function(todo) {
-      if (!!todo.done) $scope.todos.push(todo);
-    });
-  };
-}!
-
-!App methodsFor: 'initialization'!
-
-initialize
-	super initialize.
-    self axon: SimpleAxon new.
-    self model: (AppModel new title: 'Todo').
-	self axon addInterest: (
-		InterestedInTrapPathSubtree new
-			aspect: #((todos))
-			block: [ self changed: #((remaining)) ]).
-    [ self modify: #((todos)) do: [{
-        #{'text'->'learn trapped'. 'done'->true}.
-        #{'text'->'build a trapped app'. 'done'->false}
-    }]] valueWithTimeout: 2000
-! !
-
-Object subclass: #AppModel
+(Smalltalk packageAt: 'Trapped-Todo') imports: {'trapped/Trapped-Processors'}!
+Object subclass: #TrappedTodo
 	instanceVariableNames: 'title todos todoText'
 	package: 'Trapped-Todo'!
-!AppModel commentStamp!
+!TrappedTodo commentStamp!
 // Code from AngularJS Todo example, http://angularjs.org/#todo-js
 function TodoCtrl($scope) {
   $scope.todos = [
@@ -79,7 +32,7 @@ function TodoCtrl($scope) {
   };
 }!
 
-!AppModel methodsFor: 'accessing'!
+!TrappedTodo methodsFor: 'accessing'!
 
 remaining
     ^self todosNotDone size
@@ -113,7 +66,7 @@ todosNotDone
     ^self todos reject: [ :each | each at: 'done' ]
 ! !
 
-!AppModel methodsFor: 'action'!
+!TrappedTodo methodsFor: 'action'!
 
 addTodo
     self todos add: #{'text'->self todoText. 'done'->false}.
@@ -124,6 +77,29 @@ archive
     self todos: self todosNotDone
 ! !
 
+!TrappedTodo methodsFor: 'initialization'!
+
+initialize
+	| axon |
+	super initialize.
+
+    axon := SimpleAxon new.
+	axon registerIn: self.
+	
+	axon addInterest: (TrappedPosition
+		interestOn: #((todos) nil)
+		block: [ axon changed: #((remaining)) ]).
+
+    [ self axes: #((todos)) transform: [{
+        #{'text'->'learn trapped'. 'done'->true}.
+        #{'text'->'build a trapped app'. 'done'->false}
+    }]] valueWithTimeout: 2000.
+
+	title := 'Todo'.
+	todoText := nil.
+	todos := nil
+! !
+
 !TrappedProcessor class methodsFor: '*Trapped-Todo'!
 
 classDoneXxx

+ 2 - 2
example-todo/todo.html

@@ -1,5 +1,5 @@
 <!doctype html>
-<html data-trap="App: path">
+<html data-trap="TrappedTodo: path">
 <head>
     <title data-trap="~title"></title>
     <style>
@@ -23,7 +23,7 @@
                     require(["amber-ide-starter-dialog"], function (dlg) { dlg.start(); });
 
                     $(function () {
-                        blackboard = amber.globals.App._new();
+                        blackboard = amber.globals.TrappedTodo._new();
                         amber.globals.Trapped._start_([blackboard]);
                     });
                 });

+ 0 - 1
local.amd.json

@@ -1,7 +1,6 @@
 {
     "paths": {
         "trapped": "src",
-        "axon": "src",
         "trapped-todo": "example-todo/src",
         "trapped-counter": "example-counter/src"
     }

+ 0 - 76
src/Axon.js

@@ -1,76 +0,0 @@
-define(["amber/boot", "amber_core/Kernel-Objects"], function($boot){"use strict";
-if(!$boot.nilAsReceiver)$boot.nilAsReceiver=$boot.nil;
-if(!("nilAsValue" in $boot))$boot.nilAsValue=$boot.nilAsReceiver;
-var $core=$boot.api,nil=$boot.nilAsValue,$nil=$boot.nilAsReceiver,$recv=$boot.asReceiver,$globals=$boot.globals;
-if(!$boot.nilAsClass)$boot.nilAsClass=$boot.dnu;
-$core.addPackage("Axon");
-$core.packages["Axon"].innerEval = function (expr) { return eval(expr); };
-$core.packages["Axon"].transport = {"type":"amd","amdNamespace":"axon"};
-
-$core.addClass("AxonizedObject", $globals.Object, ["axon"], "Axon");
-//>>excludeStart("ide", pragmas.excludeIdeData);
-$globals.AxonizedObject.comment="I am base class for object using Axon changed:\x0afor event / change logistics,\x0a\x0aSet Axon instance with `axon:` and then use\x0a`self changed: anAspect` to trigger axon's `changed:`.";
-//>>excludeEnd("ide");
-$core.addMethod(
-$core.method({
-selector: "axon",
-protocol: "accessing",
-fn: function (){
-var self=this,$self=this;
-return $self["@axon"];
-
-},
-//>>excludeStart("ide", pragmas.excludeIdeData);
-args: [],
-source: "axon\x0a\x09^ axon",
-referencedClasses: [],
-//>>excludeEnd("ide");
-messageSends: []
-}),
-$globals.AxonizedObject);
-
-$core.addMethod(
-$core.method({
-selector: "axon:",
-protocol: "accessing",
-fn: function (anAxon){
-var self=this,$self=this;
-$self["@axon"]=anAxon;
-return self;
-
-},
-//>>excludeStart("ide", pragmas.excludeIdeData);
-args: ["anAxon"],
-source: "axon: anAxon\x0a\x09axon := anAxon",
-referencedClasses: [],
-//>>excludeEnd("ide");
-messageSends: []
-}),
-$globals.AxonizedObject);
-
-$core.addMethod(
-$core.method({
-selector: "changed:",
-protocol: "action",
-fn: function (anAspect){
-var self=this,$self=this;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-return $core.withContext(function($ctx1) {
-//>>excludeEnd("ctx");
-$recv($self._axon())._changed_(anAspect);
-return self;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx1) {$ctx1.fill(self,"changed:",{anAspect:anAspect},$globals.AxonizedObject)});
-//>>excludeEnd("ctx");
-},
-//>>excludeStart("ide", pragmas.excludeIdeData);
-args: ["anAspect"],
-source: "changed: anAspect\x0a\x09self axon changed: anAspect",
-referencedClasses: [],
-//>>excludeEnd("ide");
-messageSends: ["changed:", "axon"]
-}),
-$globals.AxonizedObject);
-
-
-});

+ 0 - 27
src/Axon.st

@@ -1,27 +0,0 @@
-Smalltalk createPackage: 'Axon'!
-Object subclass: #AxonizedObject
-	instanceVariableNames: 'axon'
-	package: 'Axon'!
-!AxonizedObject commentStamp!
-I am base class for object using Axon changed:
-for event / change logistics,
-
-Set Axon instance with `axon:` and then use
-`self changed: anAspect` to trigger axon's `changed:`.!
-
-!AxonizedObject methodsFor: 'accessing'!
-
-axon
-	^ axon
-!
-
-axon: anAxon
-	axon := anAxon
-! !
-
-!AxonizedObject methodsFor: 'action'!
-
-changed: anAspect
-	self axon changed: anAspect
-! !
-

+ 0 - 870
src/Trapped-Backend.js

@@ -1,870 +0,0 @@
-define(["amber/boot"
-//>>excludeStart("imports", pragmas.excludeImports);
-, "axxord/Axxord"
-//>>excludeEnd("imports");
-, "amber_core/Kernel-Collections", "amber_core/Kernel-Objects", "axon/Axon", "axxord/Axxord"], function($boot
-//>>excludeStart("imports", pragmas.excludeImports);
-
-//>>excludeEnd("imports");
-){"use strict";
-if(!$boot.nilAsReceiver)$boot.nilAsReceiver=$boot.nil;
-if(!("nilAsValue" in $boot))$boot.nilAsValue=$boot.nilAsReceiver;
-var $core=$boot.api,nil=$boot.nilAsValue,$nil=$boot.nilAsReceiver,$recv=$boot.asReceiver,$globals=$boot.globals;
-if(!$boot.nilAsClass)$boot.nilAsClass=$boot.dnu;
-$core.addPackage("Trapped-Backend");
-$core.packages["Trapped-Backend"].innerEval = function (expr) { return eval(expr); };
-$core.packages["Trapped-Backend"].imports = ["axxord/Axxord"];
-$core.packages["Trapped-Backend"].transport = {"type":"amd","amdNamespace":"trapped"};
-
-$core.addClass("EavModel", $globals.Object, ["getBlock", "putBlock"], "Trapped-Backend");
-//>>excludeStart("ide", pragmas.excludeIdeData);
-$globals.EavModel.comment="External actor value model.";
-//>>excludeEnd("ide");
-$core.addMethod(
-$core.method({
-selector: "getBlock:",
-protocol: "accessing",
-fn: function (aBlock){
-var self=this,$self=this;
-$self["@getBlock"]=aBlock;
-return self;
-
-},
-//>>excludeStart("ide", pragmas.excludeIdeData);
-args: ["aBlock"],
-source: "getBlock: aBlock\x0a\x0agetBlock := aBlock",
-referencedClasses: [],
-//>>excludeEnd("ide");
-messageSends: []
-}),
-$globals.EavModel);
-
-$core.addMethod(
-$core.method({
-selector: "initialize",
-protocol: "initialization",
-fn: function (){
-var self=this,$self=this;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-return $core.withContext(function($ctx1) {
-//>>excludeEnd("ctx");
-(
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-$ctx1.supercall = true,
-//>>excludeEnd("ctx");
-($globals.EavModel.superclass||$boot.nilAsClass).fn.prototype._initialize.apply($self, []));
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-$ctx1.supercall = false;
-//>>excludeEnd("ctx");;
-$self["@getBlock"]=(function(){
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-return $core.withContext(function($ctx2) {
-//>>excludeEnd("ctx");
-return $self._error_("No getter block.");
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-$ctx2.sendIdx["error:"]=1;
-//>>excludeEnd("ctx");
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx2) {$ctx2.fillBlock({},$ctx1,1)});
-//>>excludeEnd("ctx");
-});
-$self["@putBlock"]=(function(){
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-return $core.withContext(function($ctx2) {
-//>>excludeEnd("ctx");
-return $self._error_("No putter block.");
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx2) {$ctx2.fillBlock({},$ctx1,2)});
-//>>excludeEnd("ctx");
-});
-return self;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx1) {$ctx1.fill(self,"initialize",{},$globals.EavModel)});
-//>>excludeEnd("ctx");
-},
-//>>excludeStart("ide", pragmas.excludeIdeData);
-args: [],
-source: "initialize\x0a\x09super initialize.\x0a\x09getBlock := [ self error: 'No getter block.' ].\x0a\x09putBlock := [ self error: 'No putter block.' ].",
-referencedClasses: [],
-//>>excludeEnd("ide");
-messageSends: ["initialize", "error:"]
-}),
-$globals.EavModel);
-
-$core.addMethod(
-$core.method({
-selector: "on:",
-protocol: "accessing",
-fn: function (anObject){
-var self=this,$self=this;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-return $core.withContext(function($ctx1) {
-//>>excludeEnd("ctx");
-return $recv($self["@getBlock"])._value_(anObject);
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx1) {$ctx1.fill(self,"on:",{anObject:anObject},$globals.EavModel)});
-//>>excludeEnd("ctx");
-},
-//>>excludeStart("ide", pragmas.excludeIdeData);
-args: ["anObject"],
-source: "on: anObject\x0a\x22Returns value of model applied on object\x22\x0a\x0a^getBlock value: anObject",
-referencedClasses: [],
-//>>excludeEnd("ide");
-messageSends: ["value:"]
-}),
-$globals.EavModel);
-
-$core.addMethod(
-$core.method({
-selector: "on:put:",
-protocol: "accessing",
-fn: function (anObject,anObject2){
-var self=this,$self=this;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-return $core.withContext(function($ctx1) {
-//>>excludeEnd("ctx");
-return $recv($self["@putBlock"])._value_value_(anObject,anObject2);
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx1) {$ctx1.fill(self,"on:put:",{anObject:anObject,anObject2:anObject2},$globals.EavModel)});
-//>>excludeEnd("ctx");
-},
-//>>excludeStart("ide", pragmas.excludeIdeData);
-args: ["anObject", "anObject2"],
-source: "on: anObject put: anObject2\x0a\x22Puts a value via model applied on object\x22\x0a\x0a^putBlock value: anObject value: anObject2",
-referencedClasses: [],
-//>>excludeEnd("ide");
-messageSends: ["value:value:"]
-}),
-$globals.EavModel);
-
-$core.addMethod(
-$core.method({
-selector: "putBlock:",
-protocol: "accessing",
-fn: function (aBlock){
-var self=this,$self=this;
-$self["@putBlock"]=aBlock;
-return self;
-
-},
-//>>excludeStart("ide", pragmas.excludeIdeData);
-args: ["aBlock"],
-source: "putBlock: aBlock\x0a\x0aputBlock := aBlock",
-referencedClasses: [],
-//>>excludeEnd("ide");
-messageSends: []
-}),
-$globals.EavModel);
-
-
-
-$core.addClass("InterestedInTrapPath", $globals.AxonInterest, [], "Trapped-Backend");
-$core.addMethod(
-$core.method({
-selector: "accepts:",
-protocol: "testing",
-fn: function (anAspect){
-var self=this,$self=this;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-return $core.withContext(function($ctx1) {
-//>>excludeEnd("ctx");
-var $2,$3,$1;
-$2=$recv(anAspect)._size();
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-$ctx1.sendIdx["size"]=1;
-//>>excludeEnd("ctx");
-$3=$recv($self["@aspect"])._size();
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-$ctx1.sendIdx["size"]=2;
-//>>excludeEnd("ctx");
-$1=$recv($2).__lt_eq($3);
-return $recv($1)._and_((function(){
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-return $core.withContext(function($ctx2) {
-//>>excludeEnd("ctx");
-return $recv(anAspect).__eq($recv($self["@aspect"])._copyFrom_to_((1),$recv(anAspect)._size()));
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx2) {$ctx2.fillBlock({},$ctx1,1)});
-//>>excludeEnd("ctx");
-}));
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx1) {$ctx1.fill(self,"accepts:",{anAspect:anAspect},$globals.InterestedInTrapPath)});
-//>>excludeEnd("ctx");
-},
-//>>excludeStart("ide", pragmas.excludeIdeData);
-args: ["anAspect"],
-source: "accepts: anAspect\x0a    ^anAspect size <= aspect size and: [anAspect = (aspect copyFrom: 1 to: anAspect size)]",
-referencedClasses: [],
-//>>excludeEnd("ide");
-messageSends: ["and:", "<=", "size", "=", "copyFrom:to:"]
-}),
-$globals.InterestedInTrapPath);
-
-
-
-$core.addClass("InterestedInTrapPathSubtree", $globals.AxonInterest, [], "Trapped-Backend");
-$core.addMethod(
-$core.method({
-selector: "accepts:",
-protocol: "testing",
-fn: function (anAspect){
-var self=this,$self=this;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-return $core.withContext(function($ctx1) {
-//>>excludeEnd("ctx");
-var $2,$3,$1,$5,$6,$4;
-$2=$recv(anAspect)._size();
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-$ctx1.sendIdx["size"]=1;
-//>>excludeEnd("ctx");
-$3=$recv($self["@aspect"])._size();
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-$ctx1.sendIdx["size"]=2;
-//>>excludeEnd("ctx");
-$1=$recv($2).__lt_eq($3);
-if($core.assert($1)){
-$5=$self["@aspect"];
-$6=$recv(anAspect)._size();
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-$ctx1.sendIdx["size"]=3;
-//>>excludeEnd("ctx");
-$4=$recv($5)._copyFrom_to_((1),$6);
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-$ctx1.sendIdx["copyFrom:to:"]=1;
-//>>excludeEnd("ctx");
-return $recv(anAspect).__eq($4);
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-$ctx1.sendIdx["="]=1;
-//>>excludeEnd("ctx");
-} else {
-return $recv($self["@aspect"]).__eq($recv(anAspect)._copyFrom_to_((1),$recv($self["@aspect"])._size()));
-}
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx1) {$ctx1.fill(self,"accepts:",{anAspect:anAspect},$globals.InterestedInTrapPathSubtree)});
-//>>excludeEnd("ctx");
-},
-//>>excludeStart("ide", pragmas.excludeIdeData);
-args: ["anAspect"],
-source: "accepts: anAspect\x0a    ^anAspect size <= aspect size\x0a\x09\x09ifTrue: [anAspect = (aspect copyFrom: 1 to: anAspect size)]\x0a\x09\x09ifFalse: [aspect = (anAspect copyFrom: 1 to: aspect size)]",
-referencedClasses: [],
-//>>excludeEnd("ide");
-messageSends: ["ifTrue:ifFalse:", "<=", "size", "=", "copyFrom:to:"]
-}),
-$globals.InterestedInTrapPathSubtree);
-
-
-
-$core.addClass("Isolator", $globals.Object, ["root"], "Trapped-Backend");
-$core.addMethod(
-$core.method({
-selector: "model:modify:",
-protocol: "action",
-fn: function (anEavModel,aBlock){
-var self=this,$self=this;
-var newValue;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-return $core.withContext(function($ctx1) {
-//>>excludeEnd("ctx");
-newValue=$recv(aBlock)._value_($recv(anEavModel)._on_(self));
-$recv(anEavModel)._on_put_(self,$recv(newValue)._deepCopy());
-return self;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx1) {$ctx1.fill(self,"model:modify:",{anEavModel:anEavModel,aBlock:aBlock,newValue:newValue},$globals.Isolator)});
-//>>excludeEnd("ctx");
-},
-//>>excludeStart("ide", pragmas.excludeIdeData);
-args: ["anEavModel", "aBlock"],
-source: "model: anEavModel modify: aBlock\x0a\x0a| newValue |\x0anewValue := aBlock value: (anEavModel on: self).\x0aanEavModel on: self put: newValue deepCopy",
-referencedClasses: [],
-//>>excludeEnd("ide");
-messageSends: ["value:", "on:", "on:put:", "deepCopy"]
-}),
-$globals.Isolator);
-
-$core.addMethod(
-$core.method({
-selector: "model:read:",
-protocol: "action",
-fn: function (anEavModel,aBlock){
-var self=this,$self=this;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-return $core.withContext(function($ctx1) {
-//>>excludeEnd("ctx");
-$recv(aBlock)._value_($recv($recv(anEavModel)._on_(self))._deepCopy());
-return self;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx1) {$ctx1.fill(self,"model:read:",{anEavModel:anEavModel,aBlock:aBlock},$globals.Isolator)});
-//>>excludeEnd("ctx");
-},
-//>>excludeStart("ide", pragmas.excludeIdeData);
-args: ["anEavModel", "aBlock"],
-source: "model: anEavModel read: aBlock\x0a\x0aaBlock value: (anEavModel on: self) deepCopy",
-referencedClasses: [],
-//>>excludeEnd("ide");
-messageSends: ["value:", "deepCopy", "on:"]
-}),
-$globals.Isolator);
-
-$core.addMethod(
-$core.method({
-selector: "root",
-protocol: "accessing",
-fn: function (){
-var self=this,$self=this;
-return $self["@root"];
-
-},
-//>>excludeStart("ide", pragmas.excludeIdeData);
-args: [],
-source: "root\x0a\x0a^root",
-referencedClasses: [],
-//>>excludeEnd("ide");
-messageSends: []
-}),
-$globals.Isolator);
-
-$core.addMethod(
-$core.method({
-selector: "root:",
-protocol: "accessing",
-fn: function (anObject){
-var self=this,$self=this;
-$self["@root"]=anObject;
-return self;
-
-},
-//>>excludeStart("ide", pragmas.excludeIdeData);
-args: ["anObject"],
-source: "root: anObject\x0a\x0aroot := anObject",
-referencedClasses: [],
-//>>excludeEnd("ide");
-messageSends: []
-}),
-$globals.Isolator);
-
-
-$core.addMethod(
-$core.method({
-selector: "on:",
-protocol: "instance creation",
-fn: function (anObject){
-var self=this,$self=this;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-return $core.withContext(function($ctx1) {
-//>>excludeEnd("ctx");
-return $recv($self._new())._root_(anObject);
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx1) {$ctx1.fill(self,"on:",{anObject:anObject},$globals.Isolator.a$cls)});
-//>>excludeEnd("ctx");
-},
-//>>excludeStart("ide", pragmas.excludeIdeData);
-args: ["anObject"],
-source: "on: anObject\x0a^self new root: anObject",
-referencedClasses: [],
-//>>excludeEnd("ide");
-messageSends: ["root:", "new"]
-}),
-$globals.Isolator.a$cls);
-
-
-$core.addClass("TrappedPosition", $globals.Object, ["path", "model"], "Trapped-Backend");
-$core.addMethod(
-$core.method({
-selector: "interestOn:block:",
-protocol: "private",
-fn: function (anAspect,aBlock){
-var self=this,$self=this;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-return $core.withContext(function($ctx1) {
-//>>excludeEnd("ctx");
-var $1,$3,$2;
-$1=$recv($recv(anAspect)._notEmpty())._and_((function(){
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-return $core.withContext(function($ctx2) {
-//>>excludeEnd("ctx");
-return $recv($recv(anAspect)._last())._isNil();
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx2) {$ctx2.fillBlock({},$ctx1,1)});
-//>>excludeEnd("ctx");
-}));
-if($core.assert($1)){
-$3=$recv($globals.InterestedInTrapPathSubtree)._new();
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-$ctx1.sendIdx["new"]=1;
-//>>excludeEnd("ctx");
-$2=$recv($3)._aspect_block_($recv(anAspect)._allButLast(),aBlock);
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-$ctx1.sendIdx["aspect:block:"]=1;
-//>>excludeEnd("ctx");
-return $2;
-} else {
-return $recv($recv($globals.InterestedInTrapPath)._new())._aspect_block_(anAspect,aBlock);
-}
-return self;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx1) {$ctx1.fill(self,"interestOn:block:",{anAspect:anAspect,aBlock:aBlock},$globals.TrappedPosition)});
-//>>excludeEnd("ctx");
-},
-//>>excludeStart("ide", pragmas.excludeIdeData);
-args: ["anAspect", "aBlock"],
-source: "interestOn: anAspect block: aBlock\x0a\x09(anAspect notEmpty and: [ anAspect last isNil ])\x0a\x09\x09ifTrue: [ ^ InterestedInTrapPathSubtree new aspect: anAspect allButLast block: aBlock ]\x0a\x09\x09ifFalse: [ ^ InterestedInTrapPath new aspect: anAspect block: aBlock ]",
-referencedClasses: ["InterestedInTrapPathSubtree", "InterestedInTrapPath"],
-//>>excludeEnd("ide");
-messageSends: ["ifTrue:ifFalse:", "and:", "notEmpty", "isNil", "last", "aspect:block:", "new", "allButLast"]
-}),
-$globals.TrappedPosition);
-
-$core.addMethod(
-$core.method({
-selector: "model",
-protocol: "accessing",
-fn: function (){
-var self=this,$self=this;
-return $self["@model"];
-
-},
-//>>excludeStart("ide", pragmas.excludeIdeData);
-args: [],
-source: "model\x0a\x09^model",
-referencedClasses: [],
-//>>excludeEnd("ide");
-messageSends: []
-}),
-$globals.TrappedPosition);
-
-$core.addMethod(
-$core.method({
-selector: "modify:",
-protocol: "action",
-fn: function (aBlock){
-var self=this,$self=this;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-return $core.withContext(function($ctx1) {
-//>>excludeEnd("ctx");
-$recv($self._model())._modify_do_($self._path(),aBlock);
-return self;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx1) {$ctx1.fill(self,"modify:",{aBlock:aBlock},$globals.TrappedPosition)});
-//>>excludeEnd("ctx");
-},
-//>>excludeStart("ide", pragmas.excludeIdeData);
-args: ["aBlock"],
-source: "modify: aBlock\x0a\x09self model modify: self path do: aBlock",
-referencedClasses: [],
-//>>excludeEnd("ide");
-messageSends: ["modify:do:", "model", "path"]
-}),
-$globals.TrappedPosition);
-
-$core.addMethod(
-$core.method({
-selector: "path",
-protocol: "accessing",
-fn: function (){
-var self=this,$self=this;
-return $self["@path"];
-
-},
-//>>excludeStart("ide", pragmas.excludeIdeData);
-args: [],
-source: "path\x0a\x09^path",
-referencedClasses: [],
-//>>excludeEnd("ide");
-messageSends: []
-}),
-$globals.TrappedPosition);
-
-$core.addMethod(
-$core.method({
-selector: "path:model:",
-protocol: "accessing",
-fn: function (anArray,aTrappedMW){
-var self=this,$self=this;
-$self["@path"]=anArray;
-$self["@model"]=aTrappedMW;
-return self;
-
-},
-//>>excludeStart("ide", pragmas.excludeIdeData);
-args: ["anArray", "aTrappedMW"],
-source: "path: anArray model: aTrappedMW\x0a\x09path := anArray.\x0a    model := aTrappedMW",
-referencedClasses: [],
-//>>excludeEnd("ide");
-messageSends: []
-}),
-$globals.TrappedPosition);
-
-$core.addMethod(
-$core.method({
-selector: "read:",
-protocol: "action",
-fn: function (aBlock){
-var self=this,$self=this;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-return $core.withContext(function($ctx1) {
-//>>excludeEnd("ctx");
-$recv($self._model())._read_do_($self._path(),aBlock);
-return self;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx1) {$ctx1.fill(self,"read:",{aBlock:aBlock},$globals.TrappedPosition)});
-//>>excludeEnd("ctx");
-},
-//>>excludeStart("ide", pragmas.excludeIdeData);
-args: ["aBlock"],
-source: "read: aBlock\x0a\x09self model read: self path do: aBlock",
-referencedClasses: [],
-//>>excludeEnd("ide");
-messageSends: ["read:do:", "model", "path"]
-}),
-$globals.TrappedPosition);
-
-$core.addMethod(
-$core.method({
-selector: "watch:",
-protocol: "action",
-fn: function (aBlock){
-var self=this,$self=this;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-return $core.withContext(function($ctx1) {
-//>>excludeEnd("ctx");
-$recv($recv($self._model())._axon())._addInterest_($self._interestOn_block_($self._path(),(function(){
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-return $core.withContext(function($ctx2) {
-//>>excludeEnd("ctx");
-return $self._read_(aBlock);
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx2) {$ctx2.fillBlock({},$ctx1,1)});
-//>>excludeEnd("ctx");
-})));
-return self;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx1) {$ctx1.fill(self,"watch:",{aBlock:aBlock},$globals.TrappedPosition)});
-//>>excludeEnd("ctx");
-},
-//>>excludeStart("ide", pragmas.excludeIdeData);
-args: ["aBlock"],
-source: "watch: aBlock\x0a\x09self model axon addInterest: (self\x0a\x09\x09interestOn: self path\x0a\x09\x09block: [ self read: aBlock ])",
-referencedClasses: [],
-//>>excludeEnd("ide");
-messageSends: ["addInterest:", "axon", "model", "interestOn:block:", "path", "read:"]
-}),
-$globals.TrappedPosition);
-
-
-
-$core.addClass("Trapper", $globals.AxonizedObject, ["payload"], "Trapped-Backend");
-//>>excludeStart("ide", pragmas.excludeIdeData);
-$globals.Trapper.comment="A portmanteau of 'Trapped wrapper', I am base class for model objects wrapped by Trapped.\x0a\x0aWrapped object is indexed by #('string-at-index' #selector numeric-at-index) array paths. Operations using this indexing are:\x0a\x0a - `read:do:` to get the indexed content\x0a - `modify:do:` to get and modify the indexed content, and\x0a - (not any more) `watch:do:` to subscribe to changes of the indexed content.\x0a\x0aThe wrapped model can be any smalltalk object.\x0a\x0aMy subclasses need to provide implementation for:\x0a\x0a - read:do:\x0a - modify:do:\x0a\x0aand must issue these calls when initializing:\x0a\x0a - axon: (with a subclass of `Axon`)\x0a - model: (with a wrapped object, after `axon:`)";
-//>>excludeEnd("ide");
-$core.addMethod(
-$core.method({
-selector: "model:",
-protocol: "accessing",
-fn: function (anObject){
-var self=this,$self=this;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-return $core.withContext(function($ctx1) {
-//>>excludeEnd("ctx");
-$self["@payload"]=anObject;
-$recv($self._axon())._changedAll();
-return self;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx1) {$ctx1.fill(self,"model:",{anObject:anObject},$globals.Trapper)});
-//>>excludeEnd("ctx");
-},
-//>>excludeStart("ide", pragmas.excludeIdeData);
-args: ["anObject"],
-source: "model: anObject\x0a\x09payload := anObject.\x0a    self axon changedAll",
-referencedClasses: [],
-//>>excludeEnd("ide");
-messageSends: ["changedAll", "axon"]
-}),
-$globals.Trapper);
-
-$core.addMethod(
-$core.method({
-selector: "modify:do:",
-protocol: "action",
-fn: function (path,aBlock){
-var self=this,$self=this;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-return $core.withContext(function($ctx1) {
-//>>excludeEnd("ctx");
-$self._subclassResponsibility();
-return self;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx1) {$ctx1.fill(self,"modify:do:",{path:path,aBlock:aBlock},$globals.Trapper)});
-//>>excludeEnd("ctx");
-},
-//>>excludeStart("ide", pragmas.excludeIdeData);
-args: ["path", "aBlock"],
-source: "modify: path do: aBlock\x0a\x09self subclassResponsibility",
-referencedClasses: [],
-//>>excludeEnd("ide");
-messageSends: ["subclassResponsibility"]
-}),
-$globals.Trapper);
-
-$core.addMethod(
-$core.method({
-selector: "read:do:",
-protocol: "action",
-fn: function (path,aBlock){
-var self=this,$self=this;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-return $core.withContext(function($ctx1) {
-//>>excludeEnd("ctx");
-$self._subclassResponsibility();
-return self;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx1) {$ctx1.fill(self,"read:do:",{path:path,aBlock:aBlock},$globals.Trapper)});
-//>>excludeEnd("ctx");
-},
-//>>excludeStart("ide", pragmas.excludeIdeData);
-args: ["path", "aBlock"],
-source: "read: path do: aBlock\x0a\x09self subclassResponsibility",
-referencedClasses: [],
-//>>excludeEnd("ide");
-messageSends: ["subclassResponsibility"]
-}),
-$globals.Trapper);
-
-
-
-$core.addClass("DirectTrapper", $globals.Trapper, [], "Trapped-Backend");
-//>>excludeStart("ide", pragmas.excludeIdeData);
-$globals.DirectTrapper.comment="I am Trapper that directly manipulate\x0athe wrapped model object.";
-//>>excludeEnd("ide");
-$core.addMethod(
-$core.method({
-selector: "modify:do:",
-protocol: "action",
-fn: function (path,aBlock){
-var self=this,$self=this;
-var newValue,eavModel;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-return $core.withContext(function($ctx1) {
-//>>excludeEnd("ctx");
-var $1;
-eavModel=$recv(path)._asEavModel();
-newValue=$recv(aBlock)._value_($recv(eavModel)._on_($self["@payload"]));
-$recv((function(){
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-return $core.withContext(function($ctx2) {
-//>>excludeEnd("ctx");
-$1=$recv($self["@payload"]).__eq_eq(newValue);
-if(!$core.assert($1)){
-return $recv(eavModel)._on_put_($self["@payload"],newValue);
-}
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx2) {$ctx2.fillBlock({},$ctx1,1)});
-//>>excludeEnd("ctx");
-}))._ensure_((function(){
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-return $core.withContext(function($ctx2) {
-//>>excludeEnd("ctx");
-return $self._changed_(path);
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx2) {$ctx2.fillBlock({},$ctx1,3)});
-//>>excludeEnd("ctx");
-}));
-return self;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx1) {$ctx1.fill(self,"modify:do:",{path:path,aBlock:aBlock,newValue:newValue,eavModel:eavModel},$globals.DirectTrapper)});
-//>>excludeEnd("ctx");
-},
-//>>excludeStart("ide", pragmas.excludeIdeData);
-args: ["path", "aBlock"],
-source: "modify: path do: aBlock\x0a    | newValue eavModel |\x0a    eavModel := path asEavModel.\x0a    newValue := aBlock value: (eavModel on: payload).\x0a    [ payload == newValue ifFalse: [ eavModel on: payload put: newValue ] ] ensure: [ self changed: path ]",
-referencedClasses: [],
-//>>excludeEnd("ide");
-messageSends: ["asEavModel", "value:", "on:", "ensure:", "ifFalse:", "==", "on:put:", "changed:"]
-}),
-$globals.DirectTrapper);
-
-$core.addMethod(
-$core.method({
-selector: "read:do:",
-protocol: "action",
-fn: function (path,aBlock){
-var self=this,$self=this;
-var eavModel;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-return $core.withContext(function($ctx1) {
-//>>excludeEnd("ctx");
-eavModel=$recv(path)._asEavModel();
-$recv(aBlock)._value_($recv(eavModel)._on_($self["@payload"]));
-return self;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx1) {$ctx1.fill(self,"read:do:",{path:path,aBlock:aBlock,eavModel:eavModel},$globals.DirectTrapper)});
-//>>excludeEnd("ctx");
-},
-//>>excludeStart("ide", pragmas.excludeIdeData);
-args: ["path", "aBlock"],
-source: "read: path do: aBlock\x0a    | eavModel |\x0a    eavModel := path asEavModel.\x0a    aBlock value: (eavModel on: payload)",
-referencedClasses: [],
-//>>excludeEnd("ide");
-messageSends: ["asEavModel", "value:", "on:"]
-}),
-$globals.DirectTrapper);
-
-
-
-$core.addClass("IsolatingTrapper", $globals.Trapper, [], "Trapped-Backend");
-//>>excludeStart("ide", pragmas.excludeIdeData);
-$globals.IsolatingTrapper.comment="I am Trapper that guards access\x0ato the wrapped model object via Isolator.\x0a\x0aIOW, read:do: gets always its own deep copy,\x0amodify:do: is not reentrant\x0aand upon writing the written part is deep-copied as well\x0a(so modifier does not hold the source of truth\x0aand can change it later).\x0a\x0aThis also means, a wrapped object and all its parts\x0amust understand `#deepCopy`.";
-//>>excludeEnd("ide");
-$core.addMethod(
-$core.method({
-selector: "model:",
-protocol: "accessing",
-fn: function (anObject){
-var self=this,$self=this;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-return $core.withContext(function($ctx1) {
-//>>excludeEnd("ctx");
-(
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-$ctx1.supercall = true,
-//>>excludeEnd("ctx");
-($globals.IsolatingTrapper.superclass||$boot.nilAsClass).fn.prototype._model_.apply($self, [$recv($globals.Isolator)._on_(anObject)]));
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-$ctx1.supercall = false;
-//>>excludeEnd("ctx");;
-return self;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx1) {$ctx1.fill(self,"model:",{anObject:anObject},$globals.IsolatingTrapper)});
-//>>excludeEnd("ctx");
-},
-//>>excludeStart("ide", pragmas.excludeIdeData);
-args: ["anObject"],
-source: "model: anObject\x0a\x09super model: (Isolator on: anObject)",
-referencedClasses: ["Isolator"],
-//>>excludeEnd("ide");
-messageSends: ["model:", "on:"]
-}),
-$globals.IsolatingTrapper);
-
-$core.addMethod(
-$core.method({
-selector: "modify:do:",
-protocol: "action",
-fn: function (path,aBlock){
-var self=this,$self=this;
-var eavModel;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-return $core.withContext(function($ctx1) {
-//>>excludeEnd("ctx");
-eavModel=$recv($recv([["root"]]).__comma(path))._asEavModel();
-$recv((function(){
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-return $core.withContext(function($ctx2) {
-//>>excludeEnd("ctx");
-return $recv($self["@payload"])._model_modify_(eavModel,aBlock);
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx2) {$ctx2.fillBlock({},$ctx1,1)});
-//>>excludeEnd("ctx");
-}))._ensure_((function(){
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-return $core.withContext(function($ctx2) {
-//>>excludeEnd("ctx");
-return $self._changed_(path);
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx2) {$ctx2.fillBlock({},$ctx1,2)});
-//>>excludeEnd("ctx");
-}));
-return self;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx1) {$ctx1.fill(self,"modify:do:",{path:path,aBlock:aBlock,eavModel:eavModel},$globals.IsolatingTrapper)});
-//>>excludeEnd("ctx");
-},
-//>>excludeStart("ide", pragmas.excludeIdeData);
-args: ["path", "aBlock"],
-source: "modify: path do: aBlock\x0a    | eavModel |\x0a    eavModel := ({{#root}},path) asEavModel.\x0a    [ payload model: eavModel modify: aBlock ] ensure: [ self changed: path ]",
-referencedClasses: [],
-//>>excludeEnd("ide");
-messageSends: ["asEavModel", ",", "ensure:", "model:modify:", "changed:"]
-}),
-$globals.IsolatingTrapper);
-
-$core.addMethod(
-$core.method({
-selector: "read:do:",
-protocol: "action",
-fn: function (path,aBlock){
-var self=this,$self=this;
-var eavModel;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-return $core.withContext(function($ctx1) {
-//>>excludeEnd("ctx");
-eavModel=$recv($recv([["root"]]).__comma(path))._asEavModel();
-$recv($self["@payload"])._model_read_(eavModel,aBlock);
-return self;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx1) {$ctx1.fill(self,"read:do:",{path:path,aBlock:aBlock,eavModel:eavModel},$globals.IsolatingTrapper)});
-//>>excludeEnd("ctx");
-},
-//>>excludeStart("ide", pragmas.excludeIdeData);
-args: ["path", "aBlock"],
-source: "read: path do: aBlock\x0a    | eavModel |\x0a    eavModel := ({{#root}},path) asEavModel.\x0a    payload model: eavModel read: aBlock",
-referencedClasses: [],
-//>>excludeEnd("ide");
-messageSends: ["asEavModel", ",", "model:read:"]
-}),
-$globals.IsolatingTrapper);
-
-
-$core.addMethod(
-$core.method({
-selector: "asEavModel",
-protocol: "*Trapped-Backend",
-fn: function (){
-var self=this,$self=this;
-var model;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-return $core.withContext(function($ctx1) {
-//>>excludeEnd("ctx");
-var $1;
-model=$recv($globals.EavModel)._new();
-$recv(model)._getBlock_((function(anObject){
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-return $core.withContext(function($ctx2) {
-//>>excludeEnd("ctx");
-return $recv(anObject)._atAxes_ifAbsent_(self,(function(){
-return nil;
-
-}));
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx2) {$ctx2.fillBlock({anObject:anObject},$ctx1,1)});
-//>>excludeEnd("ctx");
-}));
-$1=$self._isEmpty();
-if(!$core.assert($1)){
-$recv(model)._putBlock_((function(anObject,value){
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-return $core.withContext(function($ctx2) {
-//>>excludeEnd("ctx");
-return $recv(anObject)._atAxes_ifAbsent_put_(self,(function(){
-return nil;
-
-}),value);
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx2) {$ctx2.fillBlock({anObject:anObject,value:value},$ctx1,4)});
-//>>excludeEnd("ctx");
-}));
-}
-return model;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx1) {$ctx1.fill(self,"asEavModel",{model:model},$globals.SequenceableCollection)});
-//>>excludeEnd("ctx");
-},
-//>>excludeStart("ide", pragmas.excludeIdeData);
-args: [],
-source: "asEavModel\x0a    | model |\x0a    model := EavModel new.\x0a    model getBlock: [ :anObject | anObject atAxes: self ifAbsent: [ nil ] ].\x0a    self isEmpty ifFalse: [\x0a        model putBlock: [ :anObject :value | anObject atAxes: self ifAbsent: [ nil ] put: value ]].\x0a    ^model",
-referencedClasses: ["EavModel"],
-//>>excludeEnd("ide");
-messageSends: ["new", "getBlock:", "atAxes:ifAbsent:", "ifFalse:", "isEmpty", "putBlock:", "atAxes:ifAbsent:put:"]
-}),
-$globals.SequenceableCollection);
-
-});

+ 0 - 251
src/Trapped-Backend.st

@@ -1,251 +0,0 @@
-Smalltalk createPackage: 'Trapped-Backend'!
-(Smalltalk packageAt: 'Trapped-Backend') imports: {'axxord/Axxord'}!
-Object subclass: #EavModel
-	instanceVariableNames: 'getBlock putBlock'
-	package: 'Trapped-Backend'!
-!EavModel commentStamp!
-External actor value model.!
-
-!EavModel methodsFor: 'accessing'!
-
-getBlock: aBlock
-
-getBlock := aBlock
-!
-
-on: anObject
-"Returns value of model applied on object"
-
-^getBlock value: anObject
-!
-
-on: anObject put: anObject2
-"Puts a value via model applied on object"
-
-^putBlock value: anObject value: anObject2
-!
-
-putBlock: aBlock
-
-putBlock := aBlock
-! !
-
-!EavModel methodsFor: 'initialization'!
-
-initialize
-	super initialize.
-	getBlock := [ self error: 'No getter block.' ].
-	putBlock := [ self error: 'No putter block.' ].
-! !
-
-AxonInterest subclass: #InterestedInTrapPath
-	instanceVariableNames: ''
-	package: 'Trapped-Backend'!
-
-!InterestedInTrapPath methodsFor: 'testing'!
-
-accepts: anAspect
-    ^anAspect size <= aspect size and: [anAspect = (aspect copyFrom: 1 to: anAspect size)]
-! !
-
-AxonInterest subclass: #InterestedInTrapPathSubtree
-	instanceVariableNames: ''
-	package: 'Trapped-Backend'!
-
-!InterestedInTrapPathSubtree methodsFor: 'testing'!
-
-accepts: anAspect
-    ^anAspect size <= aspect size
-		ifTrue: [anAspect = (aspect copyFrom: 1 to: anAspect size)]
-		ifFalse: [aspect = (anAspect copyFrom: 1 to: aspect size)]
-! !
-
-Object subclass: #Isolator
-	instanceVariableNames: 'root'
-	package: 'Trapped-Backend'!
-
-!Isolator methodsFor: 'accessing'!
-
-root
-
-^root
-!
-
-root: anObject
-
-root := anObject
-! !
-
-!Isolator methodsFor: 'action'!
-
-model: anEavModel modify: aBlock
-
-| newValue |
-newValue := aBlock value: (anEavModel on: self).
-anEavModel on: self put: newValue deepCopy
-!
-
-model: anEavModel read: aBlock
-
-aBlock value: (anEavModel on: self) deepCopy
-! !
-
-!Isolator class methodsFor: 'instance creation'!
-
-on: anObject
-^self new root: anObject
-! !
-
-Object subclass: #TrappedPosition
-	instanceVariableNames: 'path model'
-	package: 'Trapped-Backend'!
-
-!TrappedPosition methodsFor: 'accessing'!
-
-model
-	^model
-!
-
-path
-	^path
-!
-
-path: anArray model: aTrappedMW
-	path := anArray.
-    model := aTrappedMW
-! !
-
-!TrappedPosition methodsFor: 'action'!
-
-modify: aBlock
-	self model modify: self path do: aBlock
-!
-
-read: aBlock
-	self model read: self path do: aBlock
-!
-
-watch: aBlock
-	self model axon addInterest: (self
-		interestOn: self path
-		block: [ self read: aBlock ])
-! !
-
-!TrappedPosition methodsFor: 'private'!
-
-interestOn: anAspect block: aBlock
-	(anAspect notEmpty and: [ anAspect last isNil ])
-		ifTrue: [ ^ InterestedInTrapPathSubtree new aspect: anAspect allButLast block: aBlock ]
-		ifFalse: [ ^ InterestedInTrapPath new aspect: anAspect block: aBlock ]
-! !
-
-AxonizedObject subclass: #Trapper
-	instanceVariableNames: 'payload'
-	package: 'Trapped-Backend'!
-!Trapper commentStamp!
-A portmanteau of 'Trapped wrapper', I am base class for model objects wrapped by Trapped.
-
-Wrapped object is indexed by #('string-at-index' #selector numeric-at-index) array paths. Operations using this indexing are:
-
- - `read:do:` to get the indexed content
- - `modify:do:` to get and modify the indexed content, and
- - (not any more) `watch:do:` to subscribe to changes of the indexed content.
-
-The wrapped model can be any smalltalk object.
-
-My subclasses need to provide implementation for:
-
- - read:do:
- - modify:do:
-
-and must issue these calls when initializing:
-
- - axon: (with a subclass of `Axon`)
- - model: (with a wrapped object, after `axon:`)!
-
-!Trapper methodsFor: 'accessing'!
-
-model: anObject
-	payload := anObject.
-    self axon changedAll
-! !
-
-!Trapper methodsFor: 'action'!
-
-modify: path do: aBlock
-	self subclassResponsibility
-!
-
-read: path do: aBlock
-	self subclassResponsibility
-! !
-
-Trapper subclass: #DirectTrapper
-	instanceVariableNames: ''
-	package: 'Trapped-Backend'!
-!DirectTrapper commentStamp!
-I am Trapper that directly manipulate
-the wrapped model object.!
-
-!DirectTrapper methodsFor: 'action'!
-
-modify: path do: aBlock
-    | newValue eavModel |
-    eavModel := path asEavModel.
-    newValue := aBlock value: (eavModel on: payload).
-    [ payload == newValue ifFalse: [ eavModel on: payload put: newValue ] ] ensure: [ self changed: path ]
-!
-
-read: path do: aBlock
-    | eavModel |
-    eavModel := path asEavModel.
-    aBlock value: (eavModel on: payload)
-! !
-
-Trapper subclass: #IsolatingTrapper
-	instanceVariableNames: ''
-	package: 'Trapped-Backend'!
-!IsolatingTrapper commentStamp!
-I am Trapper that guards access
-to the wrapped model object via Isolator.
-
-IOW, read:do: gets always its own deep copy,
-modify:do: is not reentrant
-and upon writing the written part is deep-copied as well
-(so modifier does not hold the source of truth
-and can change it later).
-
-This also means, a wrapped object and all its parts
-must understand `#deepCopy`.!
-
-!IsolatingTrapper methodsFor: 'accessing'!
-
-model: anObject
-	super model: (Isolator on: anObject)
-! !
-
-!IsolatingTrapper methodsFor: 'action'!
-
-modify: path do: aBlock
-    | eavModel |
-    eavModel := ({{#root}},path) asEavModel.
-    [ payload model: eavModel modify: aBlock ] ensure: [ self changed: path ]
-!
-
-read: path do: aBlock
-    | eavModel |
-    eavModel := ({{#root}},path) asEavModel.
-    payload model: eavModel read: aBlock
-! !
-
-!SequenceableCollection methodsFor: '*Trapped-Backend'!
-
-asEavModel
-    | model |
-    model := EavModel new.
-    model getBlock: [ :anObject | anObject atAxes: self ifAbsent: [ nil ] ].
-    self isEmpty ifFalse: [
-        model putBlock: [ :anObject :value | anObject atAxes: self ifAbsent: [ nil ] put: value ]].
-    ^model
-! !
-

+ 1 - 1
src/Trapped-Processors.js

@@ -2,7 +2,7 @@ define(["amber/boot"
 //>>excludeStart("imports", pragmas.excludeImports);
 , "amber/jquery/Wrappers-JQuery", "jquery.xontent"
 //>>excludeEnd("imports");
-, "trapped/Trapped-Frontend"], function($boot
+, "trapped/Trapped"], function($boot
 //>>excludeStart("imports", pragmas.excludeImports);
 
 //>>excludeEnd("imports");

+ 0 - 612
src/Trapped-Tests.js

@@ -1,612 +0,0 @@
-define(["amber/boot", "amber_core/SUnit"], function($boot){"use strict";
-if(!$boot.nilAsReceiver)$boot.nilAsReceiver=$boot.nil;
-if(!("nilAsValue" in $boot))$boot.nilAsValue=$boot.nilAsReceiver;
-var $core=$boot.api,nil=$boot.nilAsValue,$nil=$boot.nilAsReceiver,$recv=$boot.asReceiver,$globals=$boot.globals;
-if(!$boot.nilAsClass)$boot.nilAsClass=$boot.dnu;
-$core.addPackage("Trapped-Tests");
-$core.packages["Trapped-Tests"].innerEval = function (expr) { return eval(expr); };
-$core.packages["Trapped-Tests"].transport = {"type":"amd","amdNamespace":"trapped"};
-
-$core.addClass("IsolatorTest", $globals.TestCase, ["rootModel"], "Trapped-Tests");
-$core.addMethod(
-$core.method({
-selector: "setUp",
-protocol: "running",
-fn: function (){
-var self=this,$self=this;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-return $core.withContext(function($ctx1) {
-//>>excludeEnd("ctx");
-var $1;
-$1=$recv($globals.EavModel)._new();
-$recv($1)._getBlock_((function(x){
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-return $core.withContext(function($ctx2) {
-//>>excludeEnd("ctx");
-return $recv(x)._root();
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx2) {$ctx2.fillBlock({x:x},$ctx1,1)});
-//>>excludeEnd("ctx");
-}));
-$self["@rootModel"]=$recv($1)._putBlock_((function(x,y){
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-return $core.withContext(function($ctx2) {
-//>>excludeEnd("ctx");
-return $recv(x)._root_(y);
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx2) {$ctx2.fillBlock({x:x,y:y},$ctx1,2)});
-//>>excludeEnd("ctx");
-}));
-return self;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx1) {$ctx1.fill(self,"setUp",{},$globals.IsolatorTest)});
-//>>excludeEnd("ctx");
-},
-//>>excludeStart("ide", pragmas.excludeIdeData);
-args: [],
-source: "setUp\x0a\x0arootModel := EavModel new\x0a\x09getBlock: [:x | x root];\x0a    putBlock: [:x :y | x root: y].",
-referencedClasses: ["EavModel"],
-//>>excludeEnd("ide");
-messageSends: ["getBlock:", "new", "root", "putBlock:", "root:"]
-}),
-$globals.IsolatorTest);
-
-$core.addMethod(
-$core.method({
-selector: "testNontrivialModelGetsAppropriateValueForModification",
-protocol: "tests",
-fn: function (){
-var self=this,$self=this;
-var isolator,model,result;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-return $core.withContext(function($ctx1) {
-//>>excludeEnd("ctx");
-var $1,$3,$2;
-result=nil;
-isolator=$recv($globals.Isolator)._on_($globals.HashedCollection._newFromPairs_(["foo",["bar", [(1), [(2), (5)]], "baz"],"moo","zoo"]));
-$1=$recv($globals.EavModel)._new();
-$recv($1)._getBlock_((function(x){
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-return $core.withContext(function($ctx2) {
-//>>excludeEnd("ctx");
-$3=$recv(x)._root();
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-$ctx2.sendIdx["root"]=1;
-//>>excludeEnd("ctx");
-$2=$recv($3)._at_("foo");
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-$ctx2.sendIdx["at:"]=2;
-//>>excludeEnd("ctx");
-return $recv($2)._at_((2));
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-$ctx2.sendIdx["at:"]=1;
-//>>excludeEnd("ctx");
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx2) {$ctx2.fillBlock({x:x},$ctx1,1)});
-//>>excludeEnd("ctx");
-}));
-model=$recv($1)._putBlock_((function(x,y){
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-return $core.withContext(function($ctx2) {
-//>>excludeEnd("ctx");
-return $recv($recv($recv(x)._root())._at_("foo"))._at_put_((2),y);
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx2) {$ctx2.fillBlock({x:x,y:y},$ctx1,2)});
-//>>excludeEnd("ctx");
-}));
-$recv(isolator)._model_modify_(model,(function(r){
-result=r;
-return result;
-
-}));
-$self._assert_equals_([(1), [(2), (5)]],result);
-return self;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx1) {$ctx1.fill(self,"testNontrivialModelGetsAppropriateValueForModification",{isolator:isolator,model:model,result:result},$globals.IsolatorTest)});
-//>>excludeEnd("ctx");
-},
-//>>excludeStart("ide", pragmas.excludeIdeData);
-args: [],
-source: "testNontrivialModelGetsAppropriateValueForModification\x0a| isolator model result |\x0aresult := nil.\x0aisolator := Isolator on: #{ 'foo' -> #('bar' #(1 #(2 5)) 'baz'). 'moo' -> 'zoo' }.\x0amodel := EavModel new\x0a\x09getBlock: [ :x | (x root at: 'foo') at: 2 ];\x0a\x09putBlock: [ :x :y | (x root at: 'foo') at: 2 put: y].\x0aisolator model: model modify: [:r|result := r].\x0aself assert: #(1 #(2 5)) equals: result",
-referencedClasses: ["Isolator", "EavModel"],
-//>>excludeEnd("ide");
-messageSends: ["on:", "getBlock:", "new", "at:", "root", "putBlock:", "at:put:", "model:modify:", "assert:equals:"]
-}),
-$globals.IsolatorTest);
-
-$core.addMethod(
-$core.method({
-selector: "testNontrivialModelModifiesAppropriateValue",
-protocol: "tests",
-fn: function (){
-var self=this,$self=this;
-var isolator,model,result;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-return $core.withContext(function($ctx1) {
-//>>excludeEnd("ctx");
-var $1,$3,$2;
-result=nil;
-isolator=$recv($globals.Isolator)._on_($globals.HashedCollection._newFromPairs_(["foo",["bar", [(1), [(2), (3)]], "baz"],"moo","zoo"]));
-$1=$recv($globals.EavModel)._new();
-$recv($1)._getBlock_((function(x){
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-return $core.withContext(function($ctx2) {
-//>>excludeEnd("ctx");
-$3=$recv(x)._root();
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-$ctx2.sendIdx["root"]=1;
-//>>excludeEnd("ctx");
-$2=$recv($3)._at_("foo");
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-$ctx2.sendIdx["at:"]=2;
-//>>excludeEnd("ctx");
-return $recv($2)._at_((2));
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-$ctx2.sendIdx["at:"]=1;
-//>>excludeEnd("ctx");
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx2) {$ctx2.fillBlock({x:x},$ctx1,1)});
-//>>excludeEnd("ctx");
-}));
-model=$recv($1)._putBlock_((function(x,y){
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-return $core.withContext(function($ctx2) {
-//>>excludeEnd("ctx");
-return $recv($recv($recv(x)._root())._at_("foo"))._at_put_((2),y);
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx2) {$ctx2.fillBlock({x:x,y:y},$ctx1,2)});
-//>>excludeEnd("ctx");
-}));
-$recv(isolator)._model_modify_(model,(function(r){
-return "new";
-
-}));
-$recv(isolator)._model_read_(model,(function(r){
-result=r;
-return result;
-
-}));
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-$ctx1.sendIdx["model:read:"]=1;
-//>>excludeEnd("ctx");
-$self._assert_equals_("new",result);
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-$ctx1.sendIdx["assert:equals:"]=1;
-//>>excludeEnd("ctx");
-$recv(isolator)._model_read_($self["@rootModel"],(function(r){
-result=r;
-return result;
-
-}));
-$self._assert_equals_($globals.HashedCollection._newFromPairs_(["foo",["bar", "new", "baz"],"moo","zoo"]),result);
-return self;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx1) {$ctx1.fill(self,"testNontrivialModelModifiesAppropriateValue",{isolator:isolator,model:model,result:result},$globals.IsolatorTest)});
-//>>excludeEnd("ctx");
-},
-//>>excludeStart("ide", pragmas.excludeIdeData);
-args: [],
-source: "testNontrivialModelModifiesAppropriateValue\x0a| isolator model result |\x0aresult := nil.\x0aisolator := Isolator on: #{ 'foo' -> #('bar' #(1 #(2 3)) 'baz'). 'moo' -> 'zoo' }.\x0amodel := EavModel new\x0a\x09getBlock: [ :x | (x root at: 'foo') at: 2 ];\x0a\x09putBlock: [ :x :y | (x root at: 'foo') at: 2 put: y].\x0aisolator model: model modify: [:r|#new].\x0aisolator model: model read: [:r|result := r].\x0aself assert: #new equals: result.\x0aisolator model: rootModel read: [:r|result := r].\x0aself assert: #{ 'foo' -> #('bar' #new 'baz'). 'moo' -> 'zoo' } equals: result",
-referencedClasses: ["Isolator", "EavModel"],
-//>>excludeEnd("ide");
-messageSends: ["on:", "getBlock:", "new", "at:", "root", "putBlock:", "at:put:", "model:modify:", "model:read:", "assert:equals:"]
-}),
-$globals.IsolatorTest);
-
-$core.addMethod(
-$core.method({
-selector: "testNontrivialModelReturnsAppropriateValue",
-protocol: "tests",
-fn: function (){
-var self=this,$self=this;
-var isolator,model,result;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-return $core.withContext(function($ctx1) {
-//>>excludeEnd("ctx");
-result=nil;
-isolator=$recv($globals.Isolator)._on_($globals.HashedCollection._newFromPairs_(["foo",["bar", [(1), [(2), (3)]], "baz"],"moo","zoo"]));
-model=$recv($recv($globals.EavModel)._new())._getBlock_((function(x){
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-return $core.withContext(function($ctx2) {
-//>>excludeEnd("ctx");
-return $recv($recv($recv(x)._root())._at_("foo"))._at_((2));
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-$ctx2.sendIdx["at:"]=1;
-//>>excludeEnd("ctx");
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx2) {$ctx2.fillBlock({x:x},$ctx1,1)});
-//>>excludeEnd("ctx");
-}));
-$recv(isolator)._model_read_(model,(function(r){
-result=r;
-return result;
-
-}));
-$self._assert_equals_([(1), [(2), (3)]],result);
-return self;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx1) {$ctx1.fill(self,"testNontrivialModelReturnsAppropriateValue",{isolator:isolator,model:model,result:result},$globals.IsolatorTest)});
-//>>excludeEnd("ctx");
-},
-//>>excludeStart("ide", pragmas.excludeIdeData);
-args: [],
-source: "testNontrivialModelReturnsAppropriateValue\x0a| isolator model result |\x0aresult := nil.\x0aisolator := Isolator on: #{ 'foo' -> #('bar' #(1 #(2 3)) 'baz'). 'moo' -> 'zoo' }.\x0amodel := EavModel new getBlock: [ :x | (x root at: 'foo') at: 2 ].\x0aisolator model: model read: [:r|result := r].\x0aself assert: #(1 #(2 3)) equals: result",
-referencedClasses: ["Isolator", "EavModel"],
-//>>excludeEnd("ide");
-messageSends: ["on:", "getBlock:", "new", "at:", "root", "model:read:", "assert:equals:"]
-}),
-$globals.IsolatorTest);
-
-$core.addMethod(
-$core.method({
-selector: "testRootModelExaminesThenModifiesRoot",
-protocol: "tests",
-fn: function (){
-var self=this,$self=this;
-var isolator,result;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-return $core.withContext(function($ctx1) {
-//>>excludeEnd("ctx");
-result=nil;
-isolator=$recv($globals.Isolator)._on_([(1), [(2), (3)]]);
-$recv(isolator)._model_modify_($self["@rootModel"],(function(r){
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-return $core.withContext(function($ctx2) {
-//>>excludeEnd("ctx");
-return $recv(r)._second();
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx2) {$ctx2.fillBlock({r:r},$ctx1,1)});
-//>>excludeEnd("ctx");
-}));
-$recv(isolator)._model_read_($self["@rootModel"],(function(r){
-result=r;
-return result;
-
-}));
-$self._assert_equals_([(2), (3)],result);
-return self;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx1) {$ctx1.fill(self,"testRootModelExaminesThenModifiesRoot",{isolator:isolator,result:result},$globals.IsolatorTest)});
-//>>excludeEnd("ctx");
-},
-//>>excludeStart("ide", pragmas.excludeIdeData);
-args: [],
-source: "testRootModelExaminesThenModifiesRoot\x0a| isolator result |\x0aresult := nil.\x0aisolator := Isolator on: #(1 #(2 3)).\x0aisolator model: rootModel modify: [:r|r second].\x0aisolator model: rootModel read: [:r|result := r].\x0aself assert: #(2 3) equals: result",
-referencedClasses: ["Isolator"],
-//>>excludeEnd("ide");
-messageSends: ["on:", "model:modify:", "second", "model:read:", "assert:equals:"]
-}),
-$globals.IsolatorTest);
-
-$core.addMethod(
-$core.method({
-selector: "testRootModelGetsRootForModification",
-protocol: "tests",
-fn: function (){
-var self=this,$self=this;
-var isolator,result;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-return $core.withContext(function($ctx1) {
-//>>excludeEnd("ctx");
-result=nil;
-isolator=$recv($globals.Isolator)._on_([(2), [(1), (0)]]);
-$recv(isolator)._model_modify_($self["@rootModel"],(function(r){
-result=r;
-return result;
-
-}));
-$self._assert_equals_([(2), [(1), (0)]],result);
-return self;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx1) {$ctx1.fill(self,"testRootModelGetsRootForModification",{isolator:isolator,result:result},$globals.IsolatorTest)});
-//>>excludeEnd("ctx");
-},
-//>>excludeStart("ide", pragmas.excludeIdeData);
-args: [],
-source: "testRootModelGetsRootForModification\x0a| isolator result |\x0aresult := nil.\x0aisolator := Isolator on: #(2 #(1 0)).\x0aisolator model: rootModel modify: [:r|result := r].\x0aself assert: #(2 #(1 0)) equals: result",
-referencedClasses: ["Isolator"],
-//>>excludeEnd("ide");
-messageSends: ["on:", "model:modify:", "assert:equals:"]
-}),
-$globals.IsolatorTest);
-
-$core.addMethod(
-$core.method({
-selector: "testRootModelModifiesAndDeeplyIsolatesInPlaceModifiedRoot",
-protocol: "tests",
-fn: function (){
-var self=this,$self=this;
-var isolator,result,newValue;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-return $core.withContext(function($ctx1) {
-//>>excludeEnd("ctx");
-result=nil;
-newValue=nil;
-isolator=$recv($globals.Isolator)._on_([(1), [(2), (3)]]);
-$recv(isolator)._model_modify_($self["@rootModel"],(function(r){
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-return $core.withContext(function($ctx2) {
-//>>excludeEnd("ctx");
-newValue=r;
-newValue;
-$recv(r)._at_put_((1),(4));
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-$ctx2.sendIdx["at:put:"]=1;
-//>>excludeEnd("ctx");
-return r;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx2) {$ctx2.fillBlock({r:r},$ctx1,1)});
-//>>excludeEnd("ctx");
-}));
-$recv(newValue)._at_put_((2),"bar");
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-$ctx1.sendIdx["at:put:"]=2;
-//>>excludeEnd("ctx");
-$recv(isolator)._model_read_($self["@rootModel"],(function(r){
-result=r;
-return result;
-
-}));
-$recv(newValue)._at_put_((2),"baz");
-$self._assert_equals_([(4), [(2), (3)]],result);
-return self;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx1) {$ctx1.fill(self,"testRootModelModifiesAndDeeplyIsolatesInPlaceModifiedRoot",{isolator:isolator,result:result,newValue:newValue},$globals.IsolatorTest)});
-//>>excludeEnd("ctx");
-},
-//>>excludeStart("ide", pragmas.excludeIdeData);
-args: [],
-source: "testRootModelModifiesAndDeeplyIsolatesInPlaceModifiedRoot\x0a| isolator result newValue |\x0aresult := nil. newValue := nil.\x0aisolator := Isolator on: #(1 #(2 3)).\x0aisolator model: rootModel modify: [:r|newValue := r. r at: 1 put: 4. r].\x0anewValue at: 2 put: 'bar'.\x0aisolator model: rootModel read: [:r|result := r].\x0anewValue at: 2 put: 'baz'.\x0aself assert: #(4 #(2 3)) equals: result",
-referencedClasses: ["Isolator"],
-//>>excludeEnd("ide");
-messageSends: ["on:", "model:modify:", "at:put:", "model:read:", "assert:equals:"]
-}),
-$globals.IsolatorTest);
-
-$core.addMethod(
-$core.method({
-selector: "testRootModelModifiesAndDeeplyIsolatesRoot",
-protocol: "tests",
-fn: function (){
-var self=this,$self=this;
-var isolator,result,newValue;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-return $core.withContext(function($ctx1) {
-//>>excludeEnd("ctx");
-var $1;
-result=nil;
-isolator=$recv($globals.Isolator)._on_([(1), [(2), (3)]]);
-newValue=$globals.HashedCollection._newFromPairs_(["foo",[(4), (5), (6)]]);
-$recv(isolator)._model_modify_($self["@rootModel"],(function(r){
-return newValue;
-
-}));
-$1=$recv(newValue)._at_("foo");
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-$ctx1.sendIdx["at:"]=1;
-//>>excludeEnd("ctx");
-$recv($1)._at_put_((1),"bar");
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-$ctx1.sendIdx["at:put:"]=1;
-//>>excludeEnd("ctx");
-$recv(isolator)._model_read_($self["@rootModel"],(function(r){
-result=r;
-return result;
-
-}));
-$recv($recv(newValue)._at_("foo"))._at_put_((3),"baz");
-$self._assert_equals_($globals.HashedCollection._newFromPairs_(["foo",[(4), (5), (6)]]),result);
-return self;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx1) {$ctx1.fill(self,"testRootModelModifiesAndDeeplyIsolatesRoot",{isolator:isolator,result:result,newValue:newValue},$globals.IsolatorTest)});
-//>>excludeEnd("ctx");
-},
-//>>excludeStart("ide", pragmas.excludeIdeData);
-args: [],
-source: "testRootModelModifiesAndDeeplyIsolatesRoot\x0a| isolator result newValue |\x0aresult := nil.\x0aisolator := Isolator on: #(1 #(2 3)).\x0anewValue := #{'foo'->#(4 5 6)}.\x0aisolator model: rootModel modify: [:r|newValue].\x0a(newValue at: 'foo') at: 1 put: 'bar'.\x0aisolator model: rootModel read: [:r|result := r].\x0a(newValue at: 'foo') at: 3 put: 'baz'.\x0aself assert: #{'foo'->#(4 5 6)} equals: result",
-referencedClasses: ["Isolator"],
-//>>excludeEnd("ide");
-messageSends: ["on:", "model:modify:", "at:put:", "at:", "model:read:", "assert:equals:"]
-}),
-$globals.IsolatorTest);
-
-$core.addMethod(
-$core.method({
-selector: "testRootModelModifiesAndIsolatesRoot",
-protocol: "tests",
-fn: function (){
-var self=this,$self=this;
-var isolator,result,newValue;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-return $core.withContext(function($ctx1) {
-//>>excludeEnd("ctx");
-result=nil;
-isolator=$recv($globals.Isolator)._on_([(1), [(2), (3)]]);
-newValue=$globals.HashedCollection._newFromPairs_(["foo",[(4), (5), (6)]]);
-$recv(isolator)._model_modify_($self["@rootModel"],(function(r){
-return newValue;
-
-}));
-$recv(newValue)._at_put_("foo","bar");
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-$ctx1.sendIdx["at:put:"]=1;
-//>>excludeEnd("ctx");
-$recv(isolator)._model_read_($self["@rootModel"],(function(r){
-result=r;
-return result;
-
-}));
-$recv(newValue)._at_put_("foo","baz");
-$self._assert_equals_($globals.HashedCollection._newFromPairs_(["foo",[(4), (5), (6)]]),result);
-return self;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx1) {$ctx1.fill(self,"testRootModelModifiesAndIsolatesRoot",{isolator:isolator,result:result,newValue:newValue},$globals.IsolatorTest)});
-//>>excludeEnd("ctx");
-},
-//>>excludeStart("ide", pragmas.excludeIdeData);
-args: [],
-source: "testRootModelModifiesAndIsolatesRoot\x0a| isolator result newValue |\x0aresult := nil.\x0aisolator := Isolator on: #(1 #(2 3)).\x0anewValue := #{'foo'->#(4 5 6)}.\x0aisolator model: rootModel modify: [:r|newValue].\x0anewValue at: 'foo' put: 'bar'.\x0aisolator model: rootModel read: [:r|result := r].\x0anewValue at: 'foo' put: 'baz'.\x0aself assert: #{'foo'->#(4 5 6)} equals: result",
-referencedClasses: ["Isolator"],
-//>>excludeEnd("ide");
-messageSends: ["on:", "model:modify:", "at:put:", "model:read:", "assert:equals:"]
-}),
-$globals.IsolatorTest);
-
-$core.addMethod(
-$core.method({
-selector: "testRootModelModifiesRoot",
-protocol: "tests",
-fn: function (){
-var self=this,$self=this;
-var isolator,result;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-return $core.withContext(function($ctx1) {
-//>>excludeEnd("ctx");
-result=nil;
-isolator=$recv($globals.Isolator)._on_([(1), [(2), (3)]]);
-$recv(isolator)._model_modify_($self["@rootModel"],(function(r){
-return $globals.HashedCollection._newFromPairs_(["foo",[(4), (5), (6)]]);
-
-}));
-$recv(isolator)._model_read_($self["@rootModel"],(function(r){
-result=r;
-return result;
-
-}));
-$self._assert_equals_($globals.HashedCollection._newFromPairs_(["foo",[(4), (5), (6)]]),result);
-return self;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx1) {$ctx1.fill(self,"testRootModelModifiesRoot",{isolator:isolator,result:result},$globals.IsolatorTest)});
-//>>excludeEnd("ctx");
-},
-//>>excludeStart("ide", pragmas.excludeIdeData);
-args: [],
-source: "testRootModelModifiesRoot\x0a| isolator result |\x0aresult := nil.\x0aisolator := Isolator on: #(1 #(2 3)).\x0aisolator model: rootModel modify: [:r|#{'foo'->#(4 5 6)}].\x0aisolator model: rootModel read: [:r|result := r].\x0aself assert: #{'foo'->#(4 5 6)} equals: result",
-referencedClasses: ["Isolator"],
-//>>excludeEnd("ide");
-messageSends: ["on:", "model:modify:", "model:read:", "assert:equals:"]
-}),
-$globals.IsolatorTest);
-
-$core.addMethod(
-$core.method({
-selector: "testRootModelReturnsDeeplyIsolatedRoot",
-protocol: "tests",
-fn: function (){
-var self=this,$self=this;
-var isolator,result;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-return $core.withContext(function($ctx1) {
-//>>excludeEnd("ctx");
-result=nil;
-isolator=$recv($globals.Isolator)._on_([(1), [(2), (3)]]);
-$recv(isolator)._model_read_($self["@rootModel"],(function(r){
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-return $core.withContext(function($ctx2) {
-//>>excludeEnd("ctx");
-return $recv($recv(r)._at_((2)))._at_put_((1),(0));
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx2) {$ctx2.fillBlock({r:r},$ctx1,1)});
-//>>excludeEnd("ctx");
-}));
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-$ctx1.sendIdx["model:read:"]=1;
-//>>excludeEnd("ctx");
-$recv(isolator)._model_read_($self["@rootModel"],(function(r){
-result=r;
-return result;
-
-}));
-$self._assert_equals_([(1), [(2), (3)]],result);
-return self;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx1) {$ctx1.fill(self,"testRootModelReturnsDeeplyIsolatedRoot",{isolator:isolator,result:result},$globals.IsolatorTest)});
-//>>excludeEnd("ctx");
-},
-//>>excludeStart("ide", pragmas.excludeIdeData);
-args: [],
-source: "testRootModelReturnsDeeplyIsolatedRoot\x0a| isolator result |\x0aresult := nil.\x0aisolator := Isolator on: #(1 #(2 3)).\x0aisolator model: rootModel read: [:r|(r at: 2) at: 1 put: 0].\x0aisolator model: rootModel read: [:r|result := r].\x0aself assert: #(1 #(2 3)) equals: result",
-referencedClasses: ["Isolator"],
-//>>excludeEnd("ide");
-messageSends: ["on:", "model:read:", "at:put:", "at:", "assert:equals:"]
-}),
-$globals.IsolatorTest);
-
-$core.addMethod(
-$core.method({
-selector: "testRootModelReturnsIsolatedRoot",
-protocol: "tests",
-fn: function (){
-var self=this,$self=this;
-var isolator,result;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-return $core.withContext(function($ctx1) {
-//>>excludeEnd("ctx");
-result=nil;
-isolator=$recv($globals.Isolator)._on_([(1), [(2), (4)]]);
-$recv(isolator)._model_read_($self["@rootModel"],(function(r){
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-return $core.withContext(function($ctx2) {
-//>>excludeEnd("ctx");
-return $recv(r)._at_put_((2),nil);
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx2) {$ctx2.fillBlock({r:r},$ctx1,1)});
-//>>excludeEnd("ctx");
-}));
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-$ctx1.sendIdx["model:read:"]=1;
-//>>excludeEnd("ctx");
-$recv(isolator)._model_read_($self["@rootModel"],(function(r){
-result=r;
-return result;
-
-}));
-$self._assert_equals_([(1), [(2), (4)]],result);
-return self;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx1) {$ctx1.fill(self,"testRootModelReturnsIsolatedRoot",{isolator:isolator,result:result},$globals.IsolatorTest)});
-//>>excludeEnd("ctx");
-},
-//>>excludeStart("ide", pragmas.excludeIdeData);
-args: [],
-source: "testRootModelReturnsIsolatedRoot\x0a| isolator result |\x0aresult := nil.\x0aisolator := Isolator on: #(1 #(2 4)).\x0aisolator model: rootModel read: [:r|r at: 2 put: nil].\x0aisolator model: rootModel read: [:r|result := r].\x0aself assert: #(1 #(2 4)) equals: result",
-referencedClasses: ["Isolator"],
-//>>excludeEnd("ide");
-messageSends: ["on:", "model:read:", "at:put:", "assert:equals:"]
-}),
-$globals.IsolatorTest);
-
-$core.addMethod(
-$core.method({
-selector: "testRootModelReturnsRoot",
-protocol: "tests",
-fn: function (){
-var self=this,$self=this;
-var isolator,result;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-return $core.withContext(function($ctx1) {
-//>>excludeEnd("ctx");
-result=nil;
-isolator=$recv($globals.Isolator)._on_([(1), [(2), (3)]]);
-$recv(isolator)._model_read_($self["@rootModel"],(function(r){
-result=r;
-return result;
-
-}));
-$self._assert_equals_([(1), [(2), (3)]],result);
-return self;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx1) {$ctx1.fill(self,"testRootModelReturnsRoot",{isolator:isolator,result:result},$globals.IsolatorTest)});
-//>>excludeEnd("ctx");
-},
-//>>excludeStart("ide", pragmas.excludeIdeData);
-args: [],
-source: "testRootModelReturnsRoot\x0a| isolator result |\x0aresult := nil.\x0aisolator := Isolator on: #(1 #(2 3)).\x0aisolator model: rootModel read: [:r|result := r].\x0aself assert: #(1 #(2 3)) equals: result",
-referencedClasses: ["Isolator"],
-//>>excludeEnd("ide");
-messageSends: ["on:", "model:read:", "assert:equals:"]
-}),
-$globals.IsolatorTest);
-
-
-});

+ 0 - 137
src/Trapped-Tests.st

@@ -1,137 +0,0 @@
-Smalltalk createPackage: 'Trapped-Tests'!
-TestCase subclass: #IsolatorTest
-	instanceVariableNames: 'rootModel'
-	package: 'Trapped-Tests'!
-
-!IsolatorTest methodsFor: 'running'!
-
-setUp
-
-rootModel := EavModel new
-	getBlock: [:x | x root];
-    putBlock: [:x :y | x root: y].
-! !
-
-!IsolatorTest methodsFor: 'tests'!
-
-testNontrivialModelGetsAppropriateValueForModification
-| isolator model result |
-result := nil.
-isolator := Isolator on: #{ 'foo' -> #('bar' #(1 #(2 5)) 'baz'). 'moo' -> 'zoo' }.
-model := EavModel new
-	getBlock: [ :x | (x root at: 'foo') at: 2 ];
-	putBlock: [ :x :y | (x root at: 'foo') at: 2 put: y].
-isolator model: model modify: [:r|result := r].
-self assert: #(1 #(2 5)) equals: result
-!
-
-testNontrivialModelModifiesAppropriateValue
-| isolator model result |
-result := nil.
-isolator := Isolator on: #{ 'foo' -> #('bar' #(1 #(2 3)) 'baz'). 'moo' -> 'zoo' }.
-model := EavModel new
-	getBlock: [ :x | (x root at: 'foo') at: 2 ];
-	putBlock: [ :x :y | (x root at: 'foo') at: 2 put: y].
-isolator model: model modify: [:r|#new].
-isolator model: model read: [:r|result := r].
-self assert: #new equals: result.
-isolator model: rootModel read: [:r|result := r].
-self assert: #{ 'foo' -> #('bar' #new 'baz'). 'moo' -> 'zoo' } equals: result
-!
-
-testNontrivialModelReturnsAppropriateValue
-| isolator model result |
-result := nil.
-isolator := Isolator on: #{ 'foo' -> #('bar' #(1 #(2 3)) 'baz'). 'moo' -> 'zoo' }.
-model := EavModel new getBlock: [ :x | (x root at: 'foo') at: 2 ].
-isolator model: model read: [:r|result := r].
-self assert: #(1 #(2 3)) equals: result
-!
-
-testRootModelExaminesThenModifiesRoot
-| isolator result |
-result := nil.
-isolator := Isolator on: #(1 #(2 3)).
-isolator model: rootModel modify: [:r|r second].
-isolator model: rootModel read: [:r|result := r].
-self assert: #(2 3) equals: result
-!
-
-testRootModelGetsRootForModification
-| isolator result |
-result := nil.
-isolator := Isolator on: #(2 #(1 0)).
-isolator model: rootModel modify: [:r|result := r].
-self assert: #(2 #(1 0)) equals: result
-!
-
-testRootModelModifiesAndDeeplyIsolatesInPlaceModifiedRoot
-| isolator result newValue |
-result := nil. newValue := nil.
-isolator := Isolator on: #(1 #(2 3)).
-isolator model: rootModel modify: [:r|newValue := r. r at: 1 put: 4. r].
-newValue at: 2 put: 'bar'.
-isolator model: rootModel read: [:r|result := r].
-newValue at: 2 put: 'baz'.
-self assert: #(4 #(2 3)) equals: result
-!
-
-testRootModelModifiesAndDeeplyIsolatesRoot
-| isolator result newValue |
-result := nil.
-isolator := Isolator on: #(1 #(2 3)).
-newValue := #{'foo'->#(4 5 6)}.
-isolator model: rootModel modify: [:r|newValue].
-(newValue at: 'foo') at: 1 put: 'bar'.
-isolator model: rootModel read: [:r|result := r].
-(newValue at: 'foo') at: 3 put: 'baz'.
-self assert: #{'foo'->#(4 5 6)} equals: result
-!
-
-testRootModelModifiesAndIsolatesRoot
-| isolator result newValue |
-result := nil.
-isolator := Isolator on: #(1 #(2 3)).
-newValue := #{'foo'->#(4 5 6)}.
-isolator model: rootModel modify: [:r|newValue].
-newValue at: 'foo' put: 'bar'.
-isolator model: rootModel read: [:r|result := r].
-newValue at: 'foo' put: 'baz'.
-self assert: #{'foo'->#(4 5 6)} equals: result
-!
-
-testRootModelModifiesRoot
-| isolator result |
-result := nil.
-isolator := Isolator on: #(1 #(2 3)).
-isolator model: rootModel modify: [:r|#{'foo'->#(4 5 6)}].
-isolator model: rootModel read: [:r|result := r].
-self assert: #{'foo'->#(4 5 6)} equals: result
-!
-
-testRootModelReturnsDeeplyIsolatedRoot
-| isolator result |
-result := nil.
-isolator := Isolator on: #(1 #(2 3)).
-isolator model: rootModel read: [:r|(r at: 2) at: 1 put: 0].
-isolator model: rootModel read: [:r|result := r].
-self assert: #(1 #(2 3)) equals: result
-!
-
-testRootModelReturnsIsolatedRoot
-| isolator result |
-result := nil.
-isolator := Isolator on: #(1 #(2 4)).
-isolator model: rootModel read: [:r|r at: 2 put: nil].
-isolator model: rootModel read: [:r|result := r].
-self assert: #(1 #(2 4)) equals: result
-!
-
-testRootModelReturnsRoot
-| isolator result |
-result := nil.
-isolator := Isolator on: #(1 #(2 3)).
-isolator model: rootModel read: [:r|result := r].
-self assert: #(1 #(2 3)) equals: result
-! !
-

+ 285 - 100
src/Trapped-Frontend.js → src/Trapped.js

@@ -1,8 +1,8 @@
 define(["amber/boot"
 //>>excludeStart("imports", pragmas.excludeImports);
-, "amber/jquery/Wrappers-JQuery", "amber/web/Web"
+, "amber/web/Web", "axxord/Axxord"
 //>>excludeEnd("imports");
-, "amber/web/Web", "amber_core/Kernel-Collections", "amber_core/Kernel-Objects", "trapped/Trapped-Backend"], function($boot
+, "amber/web/Web", "amber_core/Kernel-Collections", "amber_core/Kernel-Objects"], function($boot
 //>>excludeStart("imports", pragmas.excludeImports);
 
 //>>excludeEnd("imports");
@@ -11,12 +11,12 @@ if(!$boot.nilAsReceiver)$boot.nilAsReceiver=$boot.nil;
 if(!("nilAsValue" in $boot))$boot.nilAsValue=$boot.nilAsReceiver;
 var $core=$boot.api,nil=$boot.nilAsValue,$nil=$boot.nilAsReceiver,$recv=$boot.asReceiver,$globals=$boot.globals;
 if(!$boot.nilAsClass)$boot.nilAsClass=$boot.dnu;
-$core.addPackage("Trapped-Frontend");
-$core.packages["Trapped-Frontend"].innerEval = function (expr) { return eval(expr); };
-$core.packages["Trapped-Frontend"].imports = ["amber/jquery/Wrappers-JQuery", "amber/web/Web"];
-$core.packages["Trapped-Frontend"].transport = {"type":"amd","amdNamespace":"trapped"};
+$core.addPackage("Trapped");
+$core.packages["Trapped"].innerEval = function (expr) { return eval(expr); };
+$core.packages["Trapped"].imports = ["amber/web/Web", "axxord/Axxord"];
+$core.packages["Trapped"].transport = {"type":"amd","amdNamespace":"trapped"};
 
-$core.addClass("TrappedDataCarrier", $globals.Object, ["target", "model", "chain"], "Trapped-Frontend");
+$core.addClass("TrappedDataCarrier", $globals.Object, ["target", "model", "chain"], "Trapped");
 $core.addMethod(
 $core.method({
 selector: "chain:",
@@ -231,7 +231,7 @@ messageSends: ["chain:", "new", "target:", "yourself"]
 $globals.TrappedDataCarrier.a$cls);
 
 
-$core.addClass("TrappedDataCarrierToModel", $globals.TrappedDataCarrier, ["index"], "Trapped-Frontend");
+$core.addClass("TrappedDataCarrierToModel", $globals.TrappedDataCarrier, ["index"], "Trapped");
 $core.addMethod(
 $core.method({
 selector: "proceed",
@@ -265,7 +265,7 @@ $globals.TrappedDataCarrierToModel);
 
 
 
-$core.addClass("TrappedDataCarrierToView", $globals.TrappedDataCarrier, ["index"], "Trapped-Frontend");
+$core.addClass("TrappedDataCarrierToView", $globals.TrappedDataCarrier, ["index"], "Trapped");
 $core.addMethod(
 $core.method({
 selector: "proceed",
@@ -299,7 +299,264 @@ $globals.TrappedDataCarrierToView);
 
 
 
-$core.addClass("TrappedProcessingChain", $globals.Object, ["processors"], "Trapped-Frontend");
+$core.addClass("TrappedPosition", $globals.Object, ["path", "model"], "Trapped");
+$core.addMethod(
+$core.method({
+selector: "model",
+protocol: "accessing",
+fn: function (){
+var self=this,$self=this;
+return $self["@model"];
+
+},
+//>>excludeStart("ide", pragmas.excludeIdeData);
+args: [],
+source: "model\x0a\x09^model",
+referencedClasses: [],
+//>>excludeEnd("ide");
+messageSends: []
+}),
+$globals.TrappedPosition);
+
+$core.addMethod(
+$core.method({
+selector: "modify:",
+protocol: "action",
+fn: function (aBlock){
+var self=this,$self=this;
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+return $core.withContext(function($ctx1) {
+//>>excludeEnd("ctx");
+$recv($self._model())._axes_transform_($self._path(),aBlock);
+return self;
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+}, function($ctx1) {$ctx1.fill(self,"modify:",{aBlock:aBlock},$globals.TrappedPosition)});
+//>>excludeEnd("ctx");
+},
+//>>excludeStart("ide", pragmas.excludeIdeData);
+args: ["aBlock"],
+source: "modify: aBlock\x0a\x09self model axes: self path transform: aBlock",
+referencedClasses: [],
+//>>excludeEnd("ide");
+messageSends: ["axes:transform:", "model", "path"]
+}),
+$globals.TrappedPosition);
+
+$core.addMethod(
+$core.method({
+selector: "path",
+protocol: "accessing",
+fn: function (){
+var self=this,$self=this;
+return $self["@path"];
+
+},
+//>>excludeStart("ide", pragmas.excludeIdeData);
+args: [],
+source: "path\x0a\x09^path",
+referencedClasses: [],
+//>>excludeEnd("ide");
+messageSends: []
+}),
+$globals.TrappedPosition);
+
+$core.addMethod(
+$core.method({
+selector: "path:model:",
+protocol: "accessing",
+fn: function (anArray,aTrappedMW){
+var self=this,$self=this;
+$self["@path"]=anArray;
+$self["@model"]=aTrappedMW;
+return self;
+
+},
+//>>excludeStart("ide", pragmas.excludeIdeData);
+args: ["anArray", "aTrappedMW"],
+source: "path: anArray model: aTrappedMW\x0a\x09path := anArray.\x0a    model := aTrappedMW",
+referencedClasses: [],
+//>>excludeEnd("ide");
+messageSends: []
+}),
+$globals.TrappedPosition);
+
+$core.addMethod(
+$core.method({
+selector: "read:",
+protocol: "action",
+fn: function (aBlock){
+var self=this,$self=this;
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+return $core.withContext(function($ctx1) {
+//>>excludeEnd("ctx");
+$recv($self._model())._axes_consume_($self._path(),aBlock);
+return self;
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+}, function($ctx1) {$ctx1.fill(self,"read:",{aBlock:aBlock},$globals.TrappedPosition)});
+//>>excludeEnd("ctx");
+},
+//>>excludeStart("ide", pragmas.excludeIdeData);
+args: ["aBlock"],
+source: "read: aBlock\x0a\x09self model axes: self path consume: aBlock",
+referencedClasses: [],
+//>>excludeEnd("ide");
+messageSends: ["axes:consume:", "model", "path"]
+}),
+$globals.TrappedPosition);
+
+$core.addMethod(
+$core.method({
+selector: "watch:",
+protocol: "action",
+fn: function (aBlock){
+var self=this,$self=this;
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+return $core.withContext(function($ctx1) {
+//>>excludeEnd("ctx");
+$recv($recv($self._model())._registeredAxon())._addInterest_($recv($self._class())._interestOn_block_($self._path(),(function(){
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+return $core.withContext(function($ctx2) {
+//>>excludeEnd("ctx");
+return $self._read_(aBlock);
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+}, function($ctx2) {$ctx2.fillBlock({},$ctx1,1)});
+//>>excludeEnd("ctx");
+})));
+return self;
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+}, function($ctx1) {$ctx1.fill(self,"watch:",{aBlock:aBlock},$globals.TrappedPosition)});
+//>>excludeEnd("ctx");
+},
+//>>excludeStart("ide", pragmas.excludeIdeData);
+args: ["aBlock"],
+source: "watch: aBlock\x0a\x09self model registeredAxon addInterest: (self class\x0a\x09\x09interestOn: self path\x0a\x09\x09block: [ self read: aBlock ])",
+referencedClasses: [],
+//>>excludeEnd("ide");
+messageSends: ["addInterest:", "registeredAxon", "model", "interestOn:block:", "class", "path", "read:"]
+}),
+$globals.TrappedPosition);
+
+
+$core.addMethod(
+$core.method({
+selector: "interestOn:block:",
+protocol: "factory",
+fn: function (anAspect,aBlock){
+var self=this,$self=this;
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+return $core.withContext(function($ctx1) {
+//>>excludeEnd("ctx");
+var $1,$3,$2;
+$1=$recv($recv(anAspect)._notEmpty())._and_((function(){
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+return $core.withContext(function($ctx2) {
+//>>excludeEnd("ctx");
+return $recv($recv(anAspect)._last())._isNil();
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+}, function($ctx2) {$ctx2.fillBlock({},$ctx1,1)});
+//>>excludeEnd("ctx");
+}));
+if($core.assert($1)){
+$3=$recv($globals.InterestedThruAxes)._new();
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+$ctx1.sendIdx["new"]=1;
+//>>excludeEnd("ctx");
+$2=$recv($3)._aspect_block_($recv(anAspect)._allButLast(),aBlock);
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+$ctx1.sendIdx["aspect:block:"]=1;
+//>>excludeEnd("ctx");
+return $2;
+} else {
+return $recv($recv($globals.InterestedUpToAxes)._new())._aspect_block_(anAspect,aBlock);
+}
+return self;
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+}, function($ctx1) {$ctx1.fill(self,"interestOn:block:",{anAspect:anAspect,aBlock:aBlock},$globals.TrappedPosition.a$cls)});
+//>>excludeEnd("ctx");
+},
+//>>excludeStart("ide", pragmas.excludeIdeData);
+args: ["anAspect", "aBlock"],
+source: "interestOn: anAspect block: aBlock\x0a\x09(anAspect notEmpty and: [ anAspect last isNil ])\x0a\x09\x09ifTrue: [ ^ InterestedThruAxes new aspect: anAspect allButLast block: aBlock ]\x0a\x09\x09ifFalse: [ ^ InterestedUpToAxes new aspect: anAspect block: aBlock ]",
+referencedClasses: ["InterestedThruAxes", "InterestedUpToAxes"],
+//>>excludeEnd("ide");
+messageSends: ["ifTrue:ifFalse:", "and:", "notEmpty", "isNil", "last", "aspect:block:", "new", "allButLast"]
+}),
+$globals.TrappedPosition.a$cls);
+
+
+$core.addClass("TrappedSnapshot", $globals.TrappedPosition, ["prefix"], "Trapped");
+$core.addMethod(
+$core.method({
+selector: "do:",
+protocol: "action",
+fn: function (aBlock){
+var self=this,$self=this;
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+return $core.withContext(function($ctx1) {
+//>>excludeEnd("ctx");
+$recv($recv($globals.TrappedPathStack)._current())._with_do_($recv([$self["@prefix"]]).__comma($self["@path"]),(function(){
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+return $core.withContext(function($ctx2) {
+//>>excludeEnd("ctx");
+return $recv(aBlock)._value_($self["@model"]);
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+}, function($ctx2) {$ctx2.fillBlock({},$ctx1,1)});
+//>>excludeEnd("ctx");
+}));
+return self;
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+}, function($ctx1) {$ctx1.fill(self,"do:",{aBlock:aBlock},$globals.TrappedSnapshot)});
+//>>excludeEnd("ctx");
+},
+//>>excludeStart("ide", pragmas.excludeIdeData);
+args: ["aBlock"],
+source: "do: aBlock\x0a\x09TrappedPathStack current with: {prefix}, path do: [ aBlock value: model ]",
+referencedClasses: ["TrappedPathStack"],
+//>>excludeEnd("ide");
+messageSends: ["with:do:", "current", ",", "value:"]
+}),
+$globals.TrappedSnapshot);
+
+$core.addMethod(
+$core.method({
+selector: "prefix",
+protocol: "accessing",
+fn: function (){
+var self=this,$self=this;
+return $self["@prefix"];
+
+},
+//>>excludeStart("ide", pragmas.excludeIdeData);
+args: [],
+source: "prefix\x0a\x09^ prefix",
+referencedClasses: [],
+//>>excludeEnd("ide");
+messageSends: []
+}),
+$globals.TrappedSnapshot);
+
+$core.addMethod(
+$core.method({
+selector: "prefix:",
+protocol: "accessing",
+fn: function (anObject){
+var self=this,$self=this;
+$self["@prefix"]=anObject;
+return self;
+
+},
+//>>excludeStart("ide", pragmas.excludeIdeData);
+args: ["anObject"],
+source: "prefix: anObject\x0a\x09prefix := anObject",
+referencedClasses: [],
+//>>excludeEnd("ide");
+messageSends: []
+}),
+$globals.TrappedSnapshot);
+
+
+
+$core.addClass("TrappedProcessingChain", $globals.Object, ["processors"], "Trapped");
 $core.addMethod(
 $core.method({
 selector: "firstProcessorNo",
@@ -548,7 +805,7 @@ messageSends: ["new:", "collect:", "ifEmpty:", "asTrapProcSendTo:"]
 $globals.TrappedProcessingChain.a$cls);
 
 
-$core.addClass("TrappedProcessor", $globals.Object, [], "Trapped-Frontend");
+$core.addClass("TrappedProcessor", $globals.Object, [], "Trapped");
 //>>excludeStart("ide", pragmas.excludeIdeData);
 $globals.TrappedProcessor.comment="I am a processing step in TrappedProcessingChain.\x0aI am stateless flyweight (aka servant)\x0aand will get all necessary data as arguments in API calls.\x0a\x0aMy public API is:\x0a - installToView:toModel:\x0a   This gets two TrappedDataCarriers set up without actual data\x0a   and at the beginning of their chains. It should do one-time\x0a   installation task needed (install event handlers etc.).\x0a   To start a chain, do: dataCarrier copy value: data; proceed.\x0a - toView:\x0a   This performs transformation of TrappedDataCarrier on its way from model to view.\x0a   Should call aDataCarrier proceed to proceed to subsequent step.\x0a - toModel:\x0a   This performs transformation of TrappedDataCarrier on its way from view to model.\x0a   Should call aDataCarrier proceed to proceed to subsequent step.";
 //>>excludeEnd("ide");
@@ -661,7 +918,7 @@ messageSends: ["new"]
 $globals.TrappedProcessor.a$cls);
 
 
-$core.addClass("TrappedDataExpectingProcessor", $globals.TrappedProcessor, [], "Trapped-Frontend");
+$core.addClass("TrappedDataExpectingProcessor", $globals.TrappedProcessor, [], "Trapped");
 //>>excludeStart("ide", pragmas.excludeIdeData);
 $globals.TrappedDataExpectingProcessor.comment="I answer true to isExpectingModelData and serve as a base class\x0afor processor that present / change model data.\x0a\x0aWhen at least one of my instances is present in the chain,\x0aautomatic databinding processor is added at the beginning\x0a(the data-binding scenario); otherwise, the chain\x0ais run immediately with true as data (run-once scenario).";
 //>>excludeEnd("ide");
@@ -685,7 +942,7 @@ $globals.TrappedDataExpectingProcessor);
 
 
 
-$core.addClass("TrappedProcessorContents", $globals.TrappedDataExpectingProcessor, [], "Trapped-Frontend");
+$core.addClass("TrappedProcessorContents", $globals.TrappedDataExpectingProcessor, [], "Trapped");
 //>>excludeStart("ide", pragmas.excludeIdeData);
 $globals.TrappedProcessorContents.comment="I put data into target via contents: in toView:";
 //>>excludeEnd("ide");
@@ -715,7 +972,7 @@ $globals.TrappedProcessorContents);
 
 
 
-$core.addClass("TrappedProcessorBlackboard", $globals.TrappedProcessor, [], "Trapped-Frontend");
+$core.addClass("TrappedProcessorBlackboard", $globals.TrappedProcessor, [], "Trapped");
 //>>excludeStart("ide", pragmas.excludeIdeData);
 $globals.TrappedProcessorBlackboard.comment="I am used internally to fetch data from blackboard\x0aor write it back.\x0a\x0aI am added to the beginning of the chain\x0awhen the chain contains at least one element\x0athat isExpectingModelData (see TrappedDataExpectingProcessor).";
 //>>excludeEnd("ide");
@@ -801,7 +1058,7 @@ $globals.TrappedProcessorBlackboard);
 
 
 
-$core.addClass("TrappedProcessorTerminator", $globals.TrappedProcessor, [], "Trapped-Frontend");
+$core.addClass("TrappedProcessorTerminator", $globals.TrappedProcessor, [], "Trapped");
 //>>excludeStart("ide", pragmas.excludeIdeData);
 $globals.TrappedProcessorTerminator.comment="I do not proceed in toView:.\x0a\x0aI am added automatically to end of chain when it does not contain\x0aany element that isExpectingModelData (see TrappedDataExpectingProcessor).";
 //>>excludeEnd("ide");
@@ -825,7 +1082,7 @@ $globals.TrappedProcessorTerminator);
 
 
 
-$core.addClass("TrappedSingleton", $globals.Object, [], "Trapped-Frontend");
+$core.addClass("TrappedSingleton", $globals.Object, [], "Trapped");
 $core.addMethod(
 $core.method({
 selector: "start:",
@@ -906,7 +1163,7 @@ messageSends: ["start:", "current"]
 $globals.TrappedSingleton.a$cls);
 
 
-$core.addClass("Trapped", $globals.TrappedSingleton, ["registry"], "Trapped-Frontend");
+$core.addClass("Trapped", $globals.TrappedSingleton, ["registry"], "Trapped");
 $core.addMethod(
 $core.method({
 selector: "byName:",
@@ -1384,7 +1641,7 @@ messageSends: ["collect:", "tokenize:", "parse:"]
 $globals.Trapped.a$cls);
 
 
-$core.addClass("TrappedPathStack", $globals.TrappedSingleton, ["elements"], "Trapped-Frontend");
+$core.addClass("TrappedPathStack", $globals.TrappedSingleton, ["elements"], "Trapped");
 $core.addMethod(
 $core.method({
 selector: "append:do:",
@@ -1500,82 +1757,10 @@ messageSends: ["ensure:", "value"]
 $globals.TrappedPathStack);
 
 
-
-$core.addClass("TrappedSnapshot", $globals.TrappedPosition, ["prefix"], "Trapped-Frontend");
-$core.addMethod(
-$core.method({
-selector: "do:",
-protocol: "action",
-fn: function (aBlock){
-var self=this,$self=this;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-return $core.withContext(function($ctx1) {
-//>>excludeEnd("ctx");
-$recv($recv($globals.TrappedPathStack)._current())._with_do_($recv([$self["@prefix"]]).__comma($self["@path"]),(function(){
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-return $core.withContext(function($ctx2) {
-//>>excludeEnd("ctx");
-return $recv(aBlock)._value_($self["@model"]);
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx2) {$ctx2.fillBlock({},$ctx1,1)});
-//>>excludeEnd("ctx");
-}));
-return self;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx1) {$ctx1.fill(self,"do:",{aBlock:aBlock},$globals.TrappedSnapshot)});
-//>>excludeEnd("ctx");
-},
-//>>excludeStart("ide", pragmas.excludeIdeData);
-args: ["aBlock"],
-source: "do: aBlock\x0a\x09TrappedPathStack current with: {prefix}, path do: [ aBlock value: model ]",
-referencedClasses: ["TrappedPathStack"],
-//>>excludeEnd("ide");
-messageSends: ["with:do:", "current", ",", "value:"]
-}),
-$globals.TrappedSnapshot);
-
-$core.addMethod(
-$core.method({
-selector: "prefix",
-protocol: "accessing",
-fn: function (){
-var self=this,$self=this;
-return $self["@prefix"];
-
-},
-//>>excludeStart("ide", pragmas.excludeIdeData);
-args: [],
-source: "prefix\x0a\x09^ prefix",
-referencedClasses: [],
-//>>excludeEnd("ide");
-messageSends: []
-}),
-$globals.TrappedSnapshot);
-
-$core.addMethod(
-$core.method({
-selector: "prefix:",
-protocol: "accessing",
-fn: function (anObject){
-var self=this,$self=this;
-$self["@prefix"]=anObject;
-return self;
-
-},
-//>>excludeStart("ide", pragmas.excludeIdeData);
-args: ["anObject"],
-source: "prefix: anObject\x0a\x09prefix := anObject",
-referencedClasses: [],
-//>>excludeEnd("ide");
-messageSends: []
-}),
-$globals.TrappedSnapshot);
-
-
 $core.addMethod(
 $core.method({
 selector: "asTrapProcSendTo:",
-protocol: "*Trapped-Frontend",
+protocol: "*Trapped",
 fn: function (anObject){
 var self=this,$self=this;
 var selector,args;
@@ -1622,7 +1807,7 @@ $globals.Array);
 $core.addMethod(
 $core.method({
 selector: "trapDescend:",
-protocol: "*Trapped-Frontend",
+protocol: "*Trapped",
 fn: function (aBlock){
 var self=this,$self=this;
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
@@ -1646,7 +1831,7 @@ $globals.Array);
 $core.addMethod(
 $core.method({
 selector: "trapIter:do:",
-protocol: "*Trapped-Frontend",
+protocol: "*Trapped",
 fn: function (path,aBlock){
 var self=this,$self=this;
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
@@ -1681,7 +1866,7 @@ $globals.HTMLCanvas);
 $core.addMethod(
 $core.method({
 selector: "asTrapProcSendTo:",
-protocol: "*Trapped-Frontend",
+protocol: "*Trapped",
 fn: function (anObject){
 var self=this,$self=this;
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
@@ -1710,7 +1895,7 @@ $globals.Object);
 $core.addMethod(
 $core.method({
 selector: "asTrapProcSendTo:",
-protocol: "*Trapped-Frontend",
+protocol: "*Trapped",
 fn: function (anObject){
 var self=this,$self=this;
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
@@ -1733,7 +1918,7 @@ $globals.String);
 $core.addMethod(
 $core.method({
 selector: "trap:",
-protocol: "*Trapped-Frontend",
+protocol: "*Trapped",
 fn: function (path){
 var self=this,$self=this;
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
@@ -1757,7 +1942,7 @@ $globals.TagBrush);
 $core.addMethod(
 $core.method({
 selector: "trap:processors:",
-protocol: "*Trapped-Frontend",
+protocol: "*Trapped",
 fn: function (path,anArray){
 var self=this,$self=this;
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
@@ -1789,7 +1974,7 @@ $globals.TagBrush);
 $core.addMethod(
 $core.method({
 selector: "trap:read:",
-protocol: "*Trapped-Frontend",
+protocol: "*Trapped",
 fn: function (path,aBlock){
 var self=this,$self=this;
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
@@ -1850,7 +2035,7 @@ $globals.TagBrush);
 $core.addMethod(
 $core.method({
 selector: "trapGuard:contents:",
-protocol: "*Trapped-Frontend",
+protocol: "*Trapped",
 fn: function (anArray,aBlock){
 var self=this,$self=this;
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
@@ -1926,7 +2111,7 @@ $globals.TagBrush);
 $core.addMethod(
 $core.method({
 selector: "trapIter:after:",
-protocol: "*Trapped-Frontend",
+protocol: "*Trapped",
 fn: function (path,aBlock){
 var self=this,$self=this;
 var end;

+ 82 - 39
src/Trapped-Frontend.st → src/Trapped.st

@@ -1,8 +1,8 @@
-Smalltalk createPackage: 'Trapped-Frontend'!
-(Smalltalk packageAt: 'Trapped-Frontend') imports: {'amber/jquery/Wrappers-JQuery'. 'amber/web/Web'}!
+Smalltalk createPackage: 'Trapped'!
+(Smalltalk packageAt: 'Trapped') imports: {'amber/web/Web'. 'axxord/Axxord'}!
 Object subclass: #TrappedDataCarrier
 	instanceVariableNames: 'target model chain'
-	package: 'Trapped-Frontend'!
+	package: 'Trapped'!
 
 !TrappedDataCarrier methodsFor: 'accessing'!
 
@@ -56,7 +56,7 @@ on: aProcessingChain target: anObject
 
 TrappedDataCarrier subclass: #TrappedDataCarrierToModel
 	instanceVariableNames: 'index'
-	package: 'Trapped-Frontend'!
+	package: 'Trapped'!
 
 !TrappedDataCarrierToModel methodsFor: 'not yet classified'!
 
@@ -67,7 +67,7 @@ proceed
 
 TrappedDataCarrier subclass: #TrappedDataCarrierToView
 	instanceVariableNames: 'index'
-	package: 'Trapped-Frontend'!
+	package: 'Trapped'!
 
 !TrappedDataCarrierToView methodsFor: 'not yet classified'!
 
@@ -76,9 +76,72 @@ proceed
 	(chain processorNo: index) toView: self
 ! !
 
+Object subclass: #TrappedPosition
+	instanceVariableNames: 'path model'
+	package: 'Trapped'!
+
+!TrappedPosition methodsFor: 'accessing'!
+
+model
+	^model
+!
+
+path
+	^path
+!
+
+path: anArray model: aTrappedMW
+	path := anArray.
+    model := aTrappedMW
+! !
+
+!TrappedPosition methodsFor: 'action'!
+
+modify: aBlock
+	self model axes: self path transform: aBlock
+!
+
+read: aBlock
+	self model axes: self path consume: aBlock
+!
+
+watch: aBlock
+	self model registeredAxon addInterest: (self class
+		interestOn: self path
+		block: [ self read: aBlock ])
+! !
+
+!TrappedPosition class methodsFor: 'factory'!
+
+interestOn: anAspect block: aBlock
+	(anAspect notEmpty and: [ anAspect last isNil ])
+		ifTrue: [ ^ InterestedThruAxes new aspect: anAspect allButLast block: aBlock ]
+		ifFalse: [ ^ InterestedUpToAxes new aspect: anAspect block: aBlock ]
+! !
+
+TrappedPosition subclass: #TrappedSnapshot
+	instanceVariableNames: 'prefix'
+	package: 'Trapped'!
+
+!TrappedSnapshot methodsFor: 'accessing'!
+
+prefix
+	^ prefix
+!
+
+prefix: anObject
+	prefix := anObject
+! !
+
+!TrappedSnapshot methodsFor: 'action'!
+
+do: aBlock
+	TrappedPathStack current with: {prefix}, path do: [ aBlock value: model ]
+! !
+
 Object subclass: #TrappedProcessingChain
 	instanceVariableNames: 'processors'
-	package: 'Trapped-Frontend'!
+	package: 'Trapped'!
 
 !TrappedProcessingChain methodsFor: 'accessing'!
 
@@ -135,7 +198,7 @@ dataTerminator
 
 Object subclass: #TrappedProcessor
 	instanceVariableNames: ''
-	package: 'Trapped-Frontend'!
+	package: 'Trapped'!
 !TrappedProcessor commentStamp!
 I am a processing step in TrappedProcessingChain.
 I am stateless flyweight (aka servant)
@@ -186,7 +249,7 @@ contents
 
 TrappedProcessor subclass: #TrappedDataExpectingProcessor
 	instanceVariableNames: ''
-	package: 'Trapped-Frontend'!
+	package: 'Trapped'!
 !TrappedDataExpectingProcessor commentStamp!
 I answer true to isExpectingModelData and serve as a base class
 for processor that present / change model data.
@@ -204,7 +267,7 @@ isExpectingModelData
 
 TrappedDataExpectingProcessor subclass: #TrappedProcessorContents
 	instanceVariableNames: ''
-	package: 'Trapped-Frontend'!
+	package: 'Trapped'!
 !TrappedProcessorContents commentStamp!
 I put data into target via contents: in toView:!
 
@@ -216,7 +279,7 @@ toView: aDataCarrier
 
 TrappedProcessor subclass: #TrappedProcessorBlackboard
 	instanceVariableNames: ''
-	package: 'Trapped-Frontend'!
+	package: 'Trapped'!
 !TrappedProcessorBlackboard commentStamp!
 I am used internally to fetch data from blackboard
 or write it back.
@@ -244,7 +307,7 @@ installToView: aDataCarrier toModel: anotherDataCarrier
 
 TrappedProcessor subclass: #TrappedProcessorTerminator
 	instanceVariableNames: ''
-	package: 'Trapped-Frontend'!
+	package: 'Trapped'!
 !TrappedProcessorTerminator commentStamp!
 I do not proceed in toView:.
 
@@ -259,7 +322,7 @@ toView: aDataCarrier
 
 Object subclass: #TrappedSingleton
 	instanceVariableNames: ''
-	package: 'Trapped-Frontend'!
+	package: 'Trapped'!
 
 !TrappedSingleton methodsFor: 'action'!
 
@@ -283,7 +346,7 @@ start: args
 
 TrappedSingleton subclass: #Trapped
 	instanceVariableNames: 'registry'
-	package: 'Trapped-Frontend'!
+	package: 'Trapped'!
 
 !Trapped methodsFor: 'accessing'!
 
@@ -385,7 +448,7 @@ loop: aSequenceableCollection between: aTagBrush and: anotherTagBrush do: aBlock
 
 TrappedSingleton subclass: #TrappedPathStack
 	instanceVariableNames: 'elements'
-	package: 'Trapped-Frontend'!
+	package: 'Trapped'!
 
 !TrappedPathStack methodsFor: 'accessing'!
 
@@ -413,27 +476,7 @@ initialize
 	elements := #().
 ! !
 
-TrappedPosition subclass: #TrappedSnapshot
-	instanceVariableNames: 'prefix'
-	package: 'Trapped-Frontend'!
-
-!TrappedSnapshot methodsFor: 'accessing'!
-
-prefix
-	^ prefix
-!
-
-prefix: anObject
-	prefix := anObject
-! !
-
-!TrappedSnapshot methodsFor: 'action'!
-
-do: aBlock
-	TrappedPathStack current with: {prefix}, path do: [ aBlock value: model ]
-! !
-
-!Array methodsFor: '*Trapped-Frontend'!
+!Array methodsFor: '*Trapped'!
 
 asTrapProcSendTo: anObject
 	| selector args |
@@ -449,25 +492,25 @@ trapDescend: aBlock
 	Trapped current descend: self snapshotDo: aBlock
 ! !
 
-!HTMLCanvas methodsFor: '*Trapped-Frontend'!
+!HTMLCanvas methodsFor: '*Trapped'!
 
 trapIter: path do: aBlock
     self with: [ :html | (html tag: 'script') at: 'type' put: 'application/x-beacon'; trapIter: path after: aBlock ]
 ! !
 
-!Object methodsFor: '*Trapped-Frontend'!
+!Object methodsFor: '*Trapped'!
 
 asTrapProcSendTo: anObject
 	self error: 'Trapped cannot use processor descriptor of ', self class name, ' type.'
 ! !
 
-!String methodsFor: '*Trapped-Frontend'!
+!String methodsFor: '*Trapped'!
 
 asTrapProcSendTo: anObject
 	^anObject perform: self
 ! !
 
-!TagBrush methodsFor: '*Trapped-Frontend'!
+!TagBrush methodsFor: '*Trapped'!
 
 trap: path
 	self trap: path processors: #()

+ 0 - 2
testing.js

@@ -2,8 +2,6 @@ define([
     './deploy',
     'amber_core/SUnit',
     // --- packages used only during automated testing begin here ---
-    'axxord/Axxord-Tests',
-    'trapped/Trapped-Tests',
     // --- packages used only during automated testing end here ---
 ], function (amber) {
     return amber;