1 | var Temple = require("./temple"),
|
2 | _ = require("underscore"),
|
3 | util = require("./util");
|
4 |
|
5 | var defaultHandler = {
|
6 | match : function(target) { return false; },
|
7 | construct : function(target) { },
|
8 | isLeaf : function(target) { return true; },
|
9 | get : function(target, path) { },
|
10 | set : function(target, path, val) { return false; },
|
11 | keys : function(target) { return []; },
|
12 | deleteProperty : function(target, path) { return false; },
|
13 | merge : function(target, mixin) { return false; },
|
14 | destroy : function(target) { }
|
15 | };
|
16 |
|
17 | var objectHandler = _.defaults({
|
18 | match: function(target) {
|
19 | return util.isPlainObject(target);
|
20 | },
|
21 | isLeaf: function(target) {
|
22 | return false;
|
23 | },
|
24 | get: function(target, path) {
|
25 | return target[path];
|
26 | },
|
27 | set: function(target, path, val) {
|
28 | target[path] = val;
|
29 | return true;
|
30 | },
|
31 | keys: function(target) {
|
32 | return Object.keys(target);
|
33 | },
|
34 | merge: function(target, mixin) {
|
35 | if (!util.isPlainObject(mixin)) return false;
|
36 | _.each(mixin, function(v, k) { this.set(k, v); }, this);
|
37 | return true;
|
38 | },
|
39 | deleteProperty: function(target, path) {
|
40 | delete target[path];
|
41 | }
|
42 | }, defaultHandler);
|
43 |
|
44 | var arrayHandler = _.defaults({
|
45 | match: function(val) {
|
46 | return Array.isArray(val);
|
47 | },
|
48 |
|
49 | construct: function(arr) {
|
50 | util.patchArray(arr);
|
51 |
|
52 | arr.observe(this._arrayObserver = (function(index, nval, oval) {
|
53 | var options = { remove: nval === void 0 },
|
54 | path = index.toString();
|
55 |
|
56 | this.set(path, nval, _.extend(options, { notify: false }));
|
57 | this.notify(path, nval, oval, options);
|
58 | }).bind(this));
|
59 | },
|
60 |
|
61 | set: function(arr, path, val) {
|
62 |
|
63 | arr[path] = val;
|
64 | return true;
|
65 | },
|
66 |
|
67 | deleteProperty: function(arr, path) {
|
68 | var index = parseInt(path, 10);
|
69 | delete arr[path];
|
70 |
|
71 |
|
72 | if (!isNaN(index) && index >= 0 && index === arr.length - 1) {
|
73 | arr.length = arr.length - 1;
|
74 | }
|
75 |
|
76 | return true;
|
77 | },
|
78 |
|
79 |
|
80 | merge: function() { return false; },
|
81 |
|
82 | destroy: function(arr) {
|
83 | arr.stopObserving(this._arrayObserver);
|
84 | }
|
85 | }, objectHandler);
|
86 |
|
87 | module.exports = [ arrayHandler, objectHandler ];
|
88 | module.exports.default = defaultHandler; |
\ | No newline at end of file |