joosy 1.2.0.alpha.71 → 1.2.0.alpha.73

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 0dee5804bf618851443ae7da79979ae1ba847e23
4
- data.tar.gz: 733416f347d8bc7ea08f1a84418b89d633f9fe9e
3
+ metadata.gz: c93a94e26133a7f31ce8568c0f30123014c392ec
4
+ data.tar.gz: 8d69ccc6b80a2da510a272e1bda09b543a79a49a
5
5
  SHA512:
6
- metadata.gz: 8a80dd2a1acfcec49e9857758ef5993bb52aa2b6110270d66ae2048eb5f8ee0ea8ff2357686664855425ef1667631f3db6f63f83e054ac481b774baf946e9a74
7
- data.tar.gz: a93ebfa487fc46b8cd8fbd63d6b43eed9e3f9aecace0fd7c3734f8384afb6017258d8126b89a98dd338d33ccaaf85077394afe1868b64d623ea6138b401967b0
6
+ metadata.gz: 57cead0f12f2bc1e652e723247688a78ed4bcf842d657d9396e9a13b8bc7bd90ea524f2f868be2a570c114a6601e7907fc2c7f5892ef389022170144791639af
7
+ data.tar.gz: 477925bb13b147ad0d52a822262bc20cbfda09d687dc1125e571cf4afd8c738234cf30fcedc1618437f71dbdf82ae035b047cad0b598f2e3bafb2b08c60f7da1
data/bower.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "joosy",
3
- "version": "1.2.0-alpha.71",
3
+ "version": "1.2.0-alpha.73",
4
4
  "main": "build/joosy.js",
5
5
  "ignore": [
6
6
  "lib",
@@ -130,7 +130,7 @@
130
130
  }
131
131
  data.__joosy_form_filler_lock = true;
132
132
  Object.each(data, function(property, val) {
133
- var entity, i, input, key, _i, _len, _ref, _results;
133
+ var entity, i, input, key, _i, _len, _results;
134
134
  key = _this.concatFieldName(scope, property);
135
135
  input = _this.$fields().filter("[name='" + key + "']:not(:file),[name='" + (key.underscore()) + "']:not(:file),[name='" + (key.camelize(false)) + "']:not(:file)");
136
136
  if (input.length > 0) {
@@ -146,16 +146,15 @@
146
146
  input.val(val);
147
147
  }
148
148
  }
149
- if (val instanceof Joosy.Resources.RESTCollection) {
150
- _ref = val.data;
149
+ if (val instanceof Joosy.Resources.Array) {
151
150
  _results = [];
152
- for (i = _i = 0, _len = _ref.length; _i < _len; i = ++_i) {
153
- entity = _ref[i];
151
+ for (i = _i = 0, _len = val.length; _i < _len; i = ++_i) {
152
+ entity = val[i];
154
153
  _results.push(filler(entity.data, _this.concatFieldName(scope, "[" + property + "_attributes][" + i + "]")));
155
154
  }
156
155
  return _results;
157
156
  } else if (val instanceof Joosy.Resources.REST) {
158
- return filler(val.data, _this.concatFieldName(scope, "[" + property + "_attributes][0]"));
157
+ return filler(val.data, _this.concatFieldName(scope, "[" + property + "_attributes]"));
159
158
  } else if (Object.isObject(val) || Object.isArray(val)) {
160
159
  return filler(val, key);
161
160
  } else {
@@ -27,22 +27,6 @@
27
27
  return this.prototype.__entityName = name;
28
28
  };
29
29
 
30
- Base.collection = function(klass) {
31
- return this.prototype.__collection = function() {
32
- return klass;
33
- };
34
- };
35
-
36
- Base.prototype.__collection = function() {
37
- var named;
38
- named = this.__entityName.camelize().pluralize() + 'Collection';
39
- if (window[named]) {
40
- return window[named];
41
- } else {
42
- return Joosy.Resources.Collection;
43
- }
44
- };
45
-
46
30
  Base.map = function(name, klass) {
47
31
  if (klass == null) {
48
32
  klass = false;
@@ -228,11 +212,16 @@
228
212
  };
229
213
 
230
214
  Base.prototype.__map = function(data, name, klass) {
231
- var entry;
215
+ var entries;
232
216
  if (Object.isArray(data[name])) {
233
- entry = new (klass.prototype.__collection())(klass);
234
- entry.load(data[name]);
235
- data[name] = entry;
217
+ entries = data[name].map(function(x) {
218
+ return klass.build(x);
219
+ });
220
+ data[name] = (function(func, args, ctor) {
221
+ ctor.prototype = func.prototype;
222
+ var child = new ctor, result = func.apply(child, args);
223
+ return Object(result) === result ? result : child;
224
+ })(Joosy.Resources.Array, entries, function(){});
236
225
  } else if (Object.isObject(data[name])) {
237
226
  data[name] = klass.build(data[name]);
238
227
  }
@@ -247,191 +236,6 @@
247
236
 
248
237
  })(Joosy.Function);
249
238
 
250
- }).call(this);
251
- (function() {
252
- var __hasProp = {}.hasOwnProperty,
253
- __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
254
- __slice = [].slice;
255
-
256
- Joosy.Resources.Collection = (function(_super) {
257
- __extends(Collection, _super);
258
-
259
- Collection.include(Joosy.Modules.Events);
260
-
261
- Collection.beforeLoad = function(action) {
262
- return this.prototype.__beforeLoad = action;
263
- };
264
-
265
- Collection.model = function(model) {
266
- return this.prototype.model = model;
267
- };
268
-
269
- function Collection(model, findOptions) {
270
- if (model == null) {
271
- model = false;
272
- }
273
- this.findOptions = findOptions;
274
- if (model) {
275
- this.model = model;
276
- }
277
- this.data = [];
278
- if (!this.model) {
279
- throw new Error("" + (Joosy.Module.__className(this)) + "> model can't be empty");
280
- }
281
- }
282
-
283
- Collection.prototype.load = function(entities, notify) {
284
- if (notify == null) {
285
- notify = true;
286
- }
287
- if (this.__beforeLoad != null) {
288
- entities = this.__beforeLoad(entities);
289
- }
290
- this.data = this.modelize(entities);
291
- if (notify) {
292
- this.trigger('changed');
293
- }
294
- return this;
295
- };
296
-
297
- Collection.prototype.modelize = function(collection) {
298
- var root,
299
- _this = this;
300
- root = this.model.prototype.__entityName.pluralize();
301
- if (!(collection instanceof Array)) {
302
- collection = collection != null ? collection[root.camelize(false)] : void 0;
303
- if (!(collection instanceof Array)) {
304
- throw new Error("Can not read incoming JSON");
305
- }
306
- }
307
- return collection.map(function(x) {
308
- return _this.model.build(x);
309
- });
310
- };
311
-
312
- Collection.prototype.each = function(callback) {
313
- return this.data.each(callback);
314
- };
315
-
316
- Collection.prototype.size = function() {
317
- return this.data.length;
318
- };
319
-
320
- Collection.prototype.find = function(description) {
321
- return this.data.find(description);
322
- };
323
-
324
- Collection.prototype.sortBy = function() {
325
- var params, _ref;
326
- params = 1 <= arguments.length ? __slice.call(arguments, 0) : [];
327
- return (_ref = this.data).sortBy.apply(_ref, params);
328
- };
329
-
330
- Collection.prototype.findById = function(id) {
331
- return this.data.find(function(x) {
332
- return x.id().toString() === id.toString();
333
- });
334
- };
335
-
336
- Collection.prototype.at = function(i) {
337
- return this.data[i];
338
- };
339
-
340
- Collection.prototype.remove = function(target, notify) {
341
- var index, result;
342
- if (notify == null) {
343
- notify = true;
344
- }
345
- if (Object.isNumber(target)) {
346
- index = target;
347
- } else {
348
- index = this.data.indexOf(target);
349
- }
350
- if (index >= 0) {
351
- result = this.data.splice(index, 1)[0];
352
- if (notify) {
353
- this.trigger('changed');
354
- }
355
- }
356
- return result;
357
- };
358
-
359
- Collection.prototype.add = function(element, index, notify) {
360
- if (index == null) {
361
- index = false;
362
- }
363
- if (notify == null) {
364
- notify = true;
365
- }
366
- if (typeof index === 'number') {
367
- this.data.splice(index, 0, element);
368
- } else {
369
- this.data.push(element);
370
- }
371
- if (notify) {
372
- this.trigger('changed');
373
- }
374
- return element;
375
- };
376
-
377
- return Collection;
378
-
379
- })(Joosy.Module);
380
-
381
- }).call(this);
382
- (function() {
383
- var _ref,
384
- __hasProp = {}.hasOwnProperty,
385
- __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
386
- __slice = [].slice;
387
-
388
- Joosy.Resources.RESTCollection = (function(_super) {
389
- __extends(RESTCollection, _super);
390
-
391
- function RESTCollection() {
392
- _ref = RESTCollection.__super__.constructor.apply(this, arguments);
393
- return _ref;
394
- }
395
-
396
- RESTCollection.include(Joosy.Modules.Log);
397
-
398
- RESTCollection.include(Joosy.Modules.Events);
399
-
400
- RESTCollection.prototype.reload = function(options, callback) {
401
- var _this = this;
402
- if (options == null) {
403
- options = {};
404
- }
405
- if (callback == null) {
406
- callback = false;
407
- }
408
- if (Object.isFunction(options)) {
409
- callback = options;
410
- options = {};
411
- }
412
- return this.model.__query(this.model.collectionPath(options, this.__source), 'GET', options.params, function(error, data, xhr) {
413
- if (data != null) {
414
- _this.load(data);
415
- }
416
- return typeof callback === "function" ? callback(error, _this, data, xhr) : void 0;
417
- });
418
- };
419
-
420
- RESTCollection.prototype.load = function() {
421
- var args, res,
422
- _this = this;
423
- args = 1 <= arguments.length ? __slice.call(arguments, 0) : [];
424
- res = RESTCollection.__super__.load.apply(this, args);
425
- this.data.each(function(x) {
426
- return x.__source = _this.__source;
427
- });
428
- return res;
429
- };
430
-
431
- return RESTCollection;
432
-
433
- })(Joosy.Resources.Collection);
434
-
435
239
  }).call(this);
436
240
  (function() {
437
241
  var _ref,
@@ -499,16 +303,6 @@
499
303
  return new ((_ref1 = this.constructor).at.apply(_ref1, args))(this.data);
500
304
  };
501
305
 
502
- REST.prototype.__collection = function() {
503
- var named;
504
- named = this.__entityName.camelize().pluralize() + 'Collection';
505
- if (window[named]) {
506
- return window[named];
507
- } else {
508
- return Joosy.Resources.RESTCollection;
509
- }
510
- };
511
-
512
306
  REST.prototype.__interpolatePath = function(source, ids) {
513
307
  if (!Object.isArray(ids)) {
514
308
  ids = [ids];
@@ -642,8 +436,26 @@
642
436
  return this.constructor.__query(this.memberPath(options), 'DELETE', options.params, callback);
643
437
  };
644
438
 
439
+ REST.prototype.reload = function(options, callback) {
440
+ var _ref1,
441
+ _this = this;
442
+ if (options == null) {
443
+ options = {};
444
+ }
445
+ if (callback == null) {
446
+ callback = false;
447
+ }
448
+ _ref1 = this.__extractOptionsAndCallback(options, callback), options = _ref1[0], callback = _ref1[1];
449
+ return this.constructor.__query(this.memberPath(options), 'GET', options.params, function(error, data, xhr) {
450
+ if (data != null) {
451
+ _this.load(data);
452
+ }
453
+ return typeof callback === "function" ? callback(error, _this, data, xhr) : void 0;
454
+ });
455
+ };
456
+
645
457
  REST.find = function(where, options, callback) {
646
- var id, path, result, _ref1,
458
+ var id, result, _ref1,
647
459
  _this = this;
648
460
  if (options == null) {
649
461
  options = {};
@@ -652,18 +464,12 @@
652
464
  callback = false;
653
465
  }
654
466
  _ref1 = this.prototype.__extractOptionsAndCallback(options, callback), options = _ref1[0], callback = _ref1[1];
655
- id = Object.isArray(where) ? where.last() : where;
656
- if (id === 'all') {
657
- result = new (this.prototype.__collection())(this, options);
658
- path = this.collectionPath(where, options);
659
- } else {
660
- result = this.build(id);
661
- path = this.memberPath(where, options);
662
- }
663
- if (Object.isArray(where) && where.length > 1) {
467
+ id = where instanceof Array ? where[where.length - 1] : where;
468
+ result = this.build(id);
469
+ if (where instanceof Array && where.length > 1) {
664
470
  result.__source = this.collectionPath(where);
665
471
  }
666
- this.__query(path, 'GET', options.params, function(error, data, xhr) {
472
+ this.__query(this.memberPath(where, options), 'GET', options.params, function(error, data, xhr) {
667
473
  if (data != null) {
668
474
  result.load(data);
669
475
  }
@@ -672,6 +478,43 @@
672
478
  return result;
673
479
  };
674
480
 
481
+ REST.all = function(where, options, callback) {
482
+ var result, _ref1, _ref2,
483
+ _this = this;
484
+ if (options == null) {
485
+ options = {};
486
+ }
487
+ if (callback == null) {
488
+ callback = false;
489
+ }
490
+ if (Object.isFunction(where) || Object.isObject(where)) {
491
+ _ref1 = this.prototype.__extractOptionsAndCallback(where, options), options = _ref1[0], callback = _ref1[1];
492
+ where = [];
493
+ } else {
494
+ _ref2 = this.prototype.__extractOptionsAndCallback(options, callback), options = _ref2[0], callback = _ref2[1];
495
+ }
496
+ result = new Joosy.Resources.Array;
497
+ this.__query(this.collectionPath(where, options), 'GET', options.params, function(error, rawData, xhr) {
498
+ var data;
499
+ if ((data = rawData) != null) {
500
+ if (Object.isObject(data) && !(data = data[_this.prototype.__entityName.pluralize()])) {
501
+ throw new Error("Invalid data for `all` received: " + (JSON.stringify(data)));
502
+ }
503
+ data = data.map(function(x) {
504
+ var instance;
505
+ instance = _this.build(x);
506
+ if (where.length > 1) {
507
+ instance.__source = _this.collectionPath(where);
508
+ }
509
+ return instance;
510
+ });
511
+ result.load.apply(result, data);
512
+ }
513
+ return typeof callback === "function" ? callback(error, result, rawData, xhr) : void 0;
514
+ });
515
+ return result;
516
+ };
517
+
675
518
  REST.__query = function(path, method, params, callback) {
676
519
  var options;
677
520
  options = {
@@ -699,24 +542,6 @@
699
542
  return $.ajax(options);
700
543
  };
701
544
 
702
- REST.prototype.reload = function(options, callback) {
703
- var _ref1,
704
- _this = this;
705
- if (options == null) {
706
- options = {};
707
- }
708
- if (callback == null) {
709
- callback = false;
710
- }
711
- _ref1 = this.__extractOptionsAndCallback(options, callback), options = _ref1[0], callback = _ref1[1];
712
- return this.constructor.__query(this.memberPath(options), 'GET', options.params, function(error, data, xhr) {
713
- if (data != null) {
714
- _this.load(data);
715
- }
716
- return typeof callback === "function" ? callback(error, _this, data, xhr) : void 0;
717
- });
718
- };
719
-
720
545
  REST.prototype.__extractOptionsAndCallback = function(options, callback) {
721
546
  if (Object.isFunction(options)) {
722
547
  callback = options;
data/build/joosy.js CHANGED
@@ -2276,6 +2276,85 @@
2276
2276
  });
2277
2277
  }
2278
2278
 
2279
+ }).call(this);
2280
+ (function() {
2281
+ Joosy.Modules.Resources = {};
2282
+
2283
+ }).call(this);
2284
+ (function() {
2285
+ var __slice = [].slice;
2286
+
2287
+ Joosy.Modules.Resources.Cacher = {
2288
+ included: function() {
2289
+ this.cache = function(cacheKey) {
2290
+ return this.prototype.__cacheKey = cacheKey;
2291
+ };
2292
+ this.fetcher = function(fetcher) {
2293
+ return this.prototype.__fetcher = fetcher;
2294
+ };
2295
+ this.cached = function(callback, cacheKey, fetcher) {
2296
+ var instance,
2297
+ _this = this;
2298
+ if (cacheKey == null) {
2299
+ cacheKey = false;
2300
+ }
2301
+ if (fetcher == null) {
2302
+ fetcher = false;
2303
+ }
2304
+ if (typeof cacheKey === 'function') {
2305
+ fetcher = cacheKey;
2306
+ cacheKey = void 0;
2307
+ }
2308
+ cacheKey || (cacheKey = this.prototype.__cacheKey);
2309
+ fetcher || (fetcher = this.prototype.__fetcher);
2310
+ if (cacheKey && localStorage && localStorage[cacheKey]) {
2311
+ instance = (function(func, args, ctor) {
2312
+ ctor.prototype = func.prototype;
2313
+ var child = new ctor, result = func.apply(child, args);
2314
+ return Object(result) === result ? result : child;
2315
+ })(this, JSON.parse(localStorage[cacheKey]), function(){});
2316
+ if (typeof callback === "function") {
2317
+ callback(instance);
2318
+ }
2319
+ return instance.refresh();
2320
+ } else {
2321
+ return this.fetch(function(results) {
2322
+ instance = (function(func, args, ctor) {
2323
+ ctor.prototype = func.prototype;
2324
+ var child = new ctor, result = func.apply(child, args);
2325
+ return Object(result) === result ? result : child;
2326
+ })(_this, results, function(){});
2327
+ return typeof callback === "function" ? callback(instance) : void 0;
2328
+ });
2329
+ }
2330
+ };
2331
+ return this.fetch = function(callback) {
2332
+ var _this = this;
2333
+ return this.prototype.__fetcher(function() {
2334
+ var results;
2335
+ results = 1 <= arguments.length ? __slice.call(arguments, 0) : [];
2336
+ if (_this.prototype.__cacheKey && localStorage) {
2337
+ localStorage[_this.prototype.__cacheKey] = JSON.stringify(results);
2338
+ }
2339
+ return callback(results);
2340
+ });
2341
+ };
2342
+ },
2343
+ refresh: function(callback) {
2344
+ var _this = this;
2345
+ return this.constructor.fetch(function(results) {
2346
+ _this.load.apply(_this, results);
2347
+ return typeof callback === "function" ? callback(_this) : void 0;
2348
+ });
2349
+ }
2350
+ };
2351
+
2352
+ if ((typeof define !== "undefined" && define !== null ? define.amd : void 0) != null) {
2353
+ define('joosy/modules/resources/cacher', function() {
2354
+ return Joosy.Modules.Resources.Cacher;
2355
+ });
2356
+ }
2357
+
2279
2358
  }).call(this);
2280
2359
  (function() {
2281
2360
  var __hasProp = {}.hasOwnProperty,
@@ -2284,9 +2363,11 @@
2284
2363
  Joosy.Resources.Array = (function(_super) {
2285
2364
  __extends(Array, _super);
2286
2365
 
2287
- Joosy.Module.include.call(Array, Joosy.Modules.Events);
2366
+ Joosy.Module.merge(Array, Joosy.Module);
2367
+
2368
+ Array.include(Joosy.Modules.Events);
2288
2369
 
2289
- Joosy.Module.include.call(Array, Joosy.Modules.Filters);
2370
+ Array.include(Joosy.Modules.Filters);
2290
2371
 
2291
2372
  Array.registerPlainFilters('beforeLoad');
2292
2373
 
@@ -2308,6 +2389,13 @@
2308
2389
  return this.__fillData(arguments);
2309
2390
  };
2310
2391
 
2392
+ Array.prototype.clone = function(callback) {
2393
+ var clone;
2394
+ clone = new this.constructor;
2395
+ clone.data = this.slice(0);
2396
+ return clone;
2397
+ };
2398
+
2311
2399
  Array.prototype.push = function() {
2312
2400
  var result;
2313
2401
  result = Array.__super__.push.apply(this, arguments);
@@ -2348,7 +2436,7 @@
2348
2436
  if (notify == null) {
2349
2437
  notify = true;
2350
2438
  }
2351
- data = data[0] instanceof Array ? data[0] : this.slice.call(data, 0);
2439
+ data = this.slice.call(data, 0);
2352
2440
  if (this.length > 0) {
2353
2441
  this.splice(0, this.length);
2354
2442
  }
@@ -2373,88 +2461,6 @@
2373
2461
  });
2374
2462
  }
2375
2463
 
2376
- }).call(this);
2377
- (function() {
2378
- var __hasProp = {}.hasOwnProperty,
2379
- __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
2380
-
2381
- Joosy.Resources.Cacher = (function(_super) {
2382
- __extends(Cacher, _super);
2383
-
2384
- Cacher.include(Joosy.Modules.Events);
2385
-
2386
- Cacher.include(Joosy.Modules.Filters);
2387
-
2388
- Cacher.registerPlainFilters('beforeLoad');
2389
-
2390
- Cacher.cache = function(cacheKey) {
2391
- return this.prototype.__cacheKey = cacheKey;
2392
- };
2393
-
2394
- Cacher.fetcher = function(fetcher) {
2395
- return this.prototype.__fetcher = fetcher;
2396
- };
2397
-
2398
- function Cacher(callback, cacheKey, fetcher) {
2399
- if (cacheKey == null) {
2400
- cacheKey = false;
2401
- }
2402
- if (fetcher == null) {
2403
- fetcher = false;
2404
- }
2405
- if (typeof cacheKey === 'function') {
2406
- fetcher = cacheKey;
2407
- cacheKey = void 0;
2408
- }
2409
- if (fetcher) {
2410
- this.__fetcher = fetcher;
2411
- }
2412
- if (cacheKey) {
2413
- this.__cacheKey = cacheKey;
2414
- }
2415
- if (this.__cacheKey && localStorage && localStorage[this.__cacheKey]) {
2416
- this.data = this.__applyBeforeLoads(JSON.parse(localStorage[this.__cacheKey]));
2417
- if (typeof callback === "function") {
2418
- callback(this);
2419
- }
2420
- this.refresh();
2421
- } else {
2422
- this.refresh(callback);
2423
- }
2424
- }
2425
-
2426
- Cacher.prototype.clone = function(callback) {
2427
- var copy;
2428
- copy = new this.constructor(callback, this.__cacheKey, this.__fetcher);
2429
- copy.data = Object.clone(this.data, true);
2430
- copy.trigger('changed');
2431
- return copy;
2432
- };
2433
-
2434
- Cacher.prototype.refresh = function(callback) {
2435
- var _this = this;
2436
- return this.__fetcher(function(result) {
2437
- if (_this.__cacheKey && localStorage) {
2438
- localStorage[_this.__cacheKey] = JSON.stringify(result);
2439
- }
2440
- _this.data = _this.__applyBeforeLoads(result);
2441
- if (typeof callback === "function") {
2442
- callback(_this);
2443
- }
2444
- return _this.trigger('changed');
2445
- });
2446
- };
2447
-
2448
- return Cacher;
2449
-
2450
- })(Joosy.Module);
2451
-
2452
- if ((typeof define !== "undefined" && define !== null ? define.amd : void 0) != null) {
2453
- define('joosy/resources/cacher', function() {
2454
- return Joosy.Resources.Cacher;
2455
- });
2456
- }
2457
-
2458
2464
  }).call(this);
2459
2465
  (function() {
2460
2466
  var __hasProp = {}.hasOwnProperty,
@@ -2467,6 +2473,8 @@
2467
2473
 
2468
2474
  Hash.include(Joosy.Modules.Filters);
2469
2475
 
2476
+ Hash.registerPlainFilters('beforeLoad');
2477
+
2470
2478
  function Hash(data) {
2471
2479
  if (data == null) {
2472
2480
  data = {};
@@ -2506,11 +2514,15 @@
2506
2514
  return this;
2507
2515
  };
2508
2516
 
2517
+ Hash.prototype.clone = function(callback) {
2518
+ return new this.constructor(Object.clone(this.data, true));
2519
+ };
2520
+
2509
2521
  Hash.prototype.__call = function(path, value) {
2510
2522
  if (arguments.length > 1) {
2511
- return this.__set(path, value);
2523
+ return this.set(path, value);
2512
2524
  } else {
2513
- return this.__get(path);
2525
+ return this.get(path);
2514
2526
  }
2515
2527
  };
2516
2528
 
@@ -2576,9 +2588,11 @@
2576
2588
 
2577
2589
  Scalar.include(Joosy.Modules.Filters);
2578
2590
 
2591
+ Scalar.registerPlainFilters('beforeLoad');
2592
+
2579
2593
  function Scalar(value) {
2580
2594
  return Scalar.__super__.constructor.call(this, function() {
2581
- return this.value = value;
2595
+ return this.load(value);
2582
2596
  });
2583
2597
  }
2584
2598
 
@@ -2586,8 +2600,9 @@
2586
2600
  return this.value;
2587
2601
  };
2588
2602
 
2589
- Scalar.prototype.set = function() {
2590
- return this.load.apply(this, arguments);
2603
+ Scalar.prototype.set = function(value) {
2604
+ this.value = value;
2605
+ return this.trigger('changed');
2591
2606
  };
2592
2607
 
2593
2608
  Scalar.prototype.load = function(value) {
@@ -2596,6 +2611,10 @@
2596
2611
  return this.value;
2597
2612
  };
2598
2613
 
2614
+ Scalar.prototype.clone = function(callback) {
2615
+ return new this.constructor(this.value);
2616
+ };
2617
+
2599
2618
  Scalar.prototype.__call = function() {
2600
2619
  if (arguments.length > 0) {
2601
2620
  return this.set(arguments[0]);
data/package.json CHANGED
@@ -4,7 +4,7 @@
4
4
  "keywords": [
5
5
  "joosy"
6
6
  ],
7
- "version": "1.2.0-alpha.71",
7
+ "version": "1.2.0-alpha.73",
8
8
  "author": "Boris Staal <boris@staal.io>",
9
9
  "homepage": "http://joosy.ws/",
10
10
  "repository": {