State.js 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. var Emitter = require('./Emitter');
  2. var each = require('./each');
  3. var some = require('./some');
  4. var toArr = require('./toArr');
  5. exports = Emitter.extend({
  6. className: 'State',
  7. initialize: function(initial, events) {
  8. this.callSuper(Emitter, 'initialize');
  9. this.current = initial;
  10. var self = this;
  11. each(events, function(event, key) {
  12. self[key] = buildEvent(key, event);
  13. });
  14. },
  15. is: function(state) {
  16. return this.current === state;
  17. }
  18. });
  19. function buildEvent(name, event) {
  20. var from = toArr(event.from);
  21. var to = event.to;
  22. return function() {
  23. var args = toArr(arguments);
  24. args.unshift(name);
  25. var hasEvent = some(
  26. from,
  27. function(val) {
  28. return this.current === val;
  29. },
  30. this
  31. );
  32. if (hasEvent) {
  33. this.current = to;
  34. this.emit.apply(this, args);
  35. } else {
  36. this.emit(
  37. 'error',
  38. new Error(this.current + ' => ' + to + ' error'),
  39. name
  40. );
  41. }
  42. };
  43. }
  44. module.exports = exports;