evil_events 0.1.0rc1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (59) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +13 -0
  3. data/.rspec +3 -0
  4. data/.rubocop.yml +84 -0
  5. data/.travis.yml +10 -0
  6. data/.yardopts +1 -0
  7. data/CODE_OF_CONDUCT.md +74 -0
  8. data/Gemfile +6 -0
  9. data/LICENSE.txt +21 -0
  10. data/README.md +17 -0
  11. data/Rakefile +6 -0
  12. data/bin/console +12 -0
  13. data/bin/setup +8 -0
  14. data/evil_events.gemspec +42 -0
  15. data/lib/evil_events/boot_point.rb +17 -0
  16. data/lib/evil_events/config.rb +30 -0
  17. data/lib/evil_events/core/activity_logging.rb +24 -0
  18. data/lib/evil_events/core/broadcasting/adapters/memory_async.rb +20 -0
  19. data/lib/evil_events/core/broadcasting/adapters/memory_sync.rb +20 -0
  20. data/lib/evil_events/core/broadcasting/adapters.rb +11 -0
  21. data/lib/evil_events/core/broadcasting/dispatcher/dispatchable.rb +17 -0
  22. data/lib/evil_events/core/broadcasting/dispatcher.rb +17 -0
  23. data/lib/evil_events/core/broadcasting/emitter.rb +45 -0
  24. data/lib/evil_events/core/broadcasting.rb +13 -0
  25. data/lib/evil_events/core/events/abstract_event.rb +44 -0
  26. data/lib/evil_events/core/events/event_class_factory.rb +54 -0
  27. data/lib/evil_events/core/events/event_extensions/adapter_customizable.rb +49 -0
  28. data/lib/evil_events/core/events/event_extensions/manageable.rb +26 -0
  29. data/lib/evil_events/core/events/event_extensions/observable.rb +49 -0
  30. data/lib/evil_events/core/events/event_extensions/payloadable/abstract_payload.rb +24 -0
  31. data/lib/evil_events/core/events/event_extensions/payloadable.rb +52 -0
  32. data/lib/evil_events/core/events/event_extensions/serializable.rb +21 -0
  33. data/lib/evil_events/core/events/event_extensions/type_aliasing.rb +87 -0
  34. data/lib/evil_events/core/events/manager/subscriber_list.rb +30 -0
  35. data/lib/evil_events/core/events/manager.rb +78 -0
  36. data/lib/evil_events/core/events/manager_factory.rb +17 -0
  37. data/lib/evil_events/core/events/manager_registry.rb +141 -0
  38. data/lib/evil_events/core/events/serializers/hash.rb +51 -0
  39. data/lib/evil_events/core/events/serializers/json.rb +43 -0
  40. data/lib/evil_events/core/events/serializers.rb +16 -0
  41. data/lib/evil_events/core/events/subscriber/mixin.rb +28 -0
  42. data/lib/evil_events/core/events/subscriber.rb +43 -0
  43. data/lib/evil_events/core/events.rb +25 -0
  44. data/lib/evil_events/core.rb +10 -0
  45. data/lib/evil_events/shared/combined_context.rb +113 -0
  46. data/lib/evil_events/shared/combined_context_mixin.rb +43 -0
  47. data/lib/evil_events/shared/configurable.rb +7 -0
  48. data/lib/evil_events/shared/delegator_resolver.rb +36 -0
  49. data/lib/evil_events/shared/dependency_container.rb +7 -0
  50. data/lib/evil_events/shared/logger.rb +13 -0
  51. data/lib/evil_events/shared/mockable_class_builder.rb +27 -0
  52. data/lib/evil_events/shared/structure.rb +7 -0
  53. data/lib/evil_events/shared/types.rb +9 -0
  54. data/lib/evil_events/shared.rb +16 -0
  55. data/lib/evil_events/system/mock.rb +70 -0
  56. data/lib/evil_events/system.rb +149 -0
  57. data/lib/evil_events/version.rb +7 -0
  58. data/lib/evil_events.rb +53 -0
  59. metadata +269 -0
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ class EvilEvents::Core::Events::Subscriber
4
+ # @api public
5
+ # @since 0.1.0
6
+ module Mixin
7
+ # @since 0.1.0
8
+ SubscriberMixinError = Class.new(StandardError)
9
+ # @since 0.1.0
10
+ IncompatibleEventAttrTypeError = Class.new(SubscriberMixinError)
11
+
12
+ # @param event_type [String, Class{EvilEvents::Core::Events::AbstractEvent}]
13
+ # @param delegator [String, Symbol, NilClass]
14
+ # @raise [IncompatibleEventAttrTypeError]
15
+ #
16
+ # @since 0.1.0
17
+ def subscribe_to(event_type, delegator: nil)
18
+ case event_type
19
+ when Class
20
+ EvilEvents::BootPoint::System[:event_system].observe(event_type, self, delegator)
21
+ when String
22
+ EvilEvents::BootPoint::System[:event_system].raw_observe(event_type, self, delegator)
23
+ else
24
+ raise IncompatibleEventAttrTypeError
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ module EvilEvents::Core::Events
4
+ # @api private
5
+ # @since 0.1.0
6
+ class Subscriber
7
+ # @return [EvilEvents::Shared::DelegatorResolver]
8
+ #
9
+ # @since 0.1.0
10
+ attr_reader :delegator_resolver
11
+
12
+ # @param subscriber [Object]
13
+ # @param delegator_resolver [EvilEvents::Shared::DelegatorResolver]
14
+ #
15
+ # @since 0.1.0
16
+ def initialize(subscriber, delegator_resolver)
17
+ @subscriber = subscriber
18
+ @delegator_resolver = delegator_resolver
19
+ end
20
+
21
+ # @param event [EvilEvents::Core::Events::AbstractEvent]
22
+ # @return void
23
+ #
24
+ # @since 0.1.0
25
+ def notify(event)
26
+ source_object.public_send(delegator, event)
27
+ end
28
+
29
+ # @return [Object]
30
+ #
31
+ # @since 0.1.0
32
+ def source_object
33
+ @subscriber
34
+ end
35
+
36
+ # @return [String, Symbol]
37
+ #
38
+ # @since 0.1.0
39
+ def delegator
40
+ @delegator ||= delegator_resolver.delegator
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ module EvilEvents::Core
4
+ # @since 0.1.0
5
+ module Events
6
+ require_relative 'events/serializers'
7
+ require_relative 'events/serializers/hash'
8
+ require_relative 'events/serializers/json'
9
+ require_relative 'events/event_extensions/type_aliasing'
10
+ require_relative 'events/event_extensions/payloadable'
11
+ require_relative 'events/event_extensions/payloadable/abstract_payload'
12
+ require_relative 'events/event_extensions/manageable'
13
+ require_relative 'events/event_extensions/adapter_customizable'
14
+ require_relative 'events/event_extensions/observable'
15
+ require_relative 'events/event_extensions/serializable'
16
+ require_relative 'events/abstract_event'
17
+ require_relative 'events/manager'
18
+ require_relative 'events/manager/subscriber_list'
19
+ require_relative 'events/manager_factory'
20
+ require_relative 'events/manager_registry'
21
+ require_relative 'events/subscriber'
22
+ require_relative 'events/subscriber/mixin'
23
+ require_relative 'events/event_class_factory'
24
+ end
25
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ module EvilEvents
4
+ # @since 0.1.0
5
+ module Core
6
+ require_relative 'core/activity_logging'
7
+ require_relative 'core/broadcasting'
8
+ require_relative 'core/events'
9
+ end
10
+ end
@@ -0,0 +1,113 @@
1
+ # frozen_string_literal: true
2
+
3
+ module EvilEvents
4
+ module Shared
5
+ # @example
6
+ # class EventStorage
7
+ # attr_reader :events
8
+ #
9
+ # def initialize
10
+ # @events = []
11
+ # end
12
+ #
13
+ # def store_event(event)
14
+ # @events << event
15
+ # end
16
+ # end
17
+ #
18
+ # storage = EventStorage.new
19
+ # event = 'test_event'
20
+ # clojure = proc { store_event(event) }
21
+ # context = EvilEvents::Shared::CombinedContext.new(storage, clojure)
22
+ #
23
+ # storage.events # => []
24
+ #
25
+ # context.evaluate
26
+ # storage.events # => ['test_event']
27
+ #
28
+ # context.evaluate
29
+ # storage.events # => ['test_event', 'test_event']
30
+ #
31
+ # @since 0.1.0
32
+ # @api public
33
+ class CombinedContext < BasicObject
34
+ # @since 0.1.0
35
+ CombinedContextError = ::Class.new(::StandardError)
36
+ # @since 0.1.0
37
+ NonProcClojureObjectError = ::Class.new(CombinedContextError)
38
+
39
+ # @return [Object]
40
+ #
41
+ # @since 0.1.0
42
+ attr_reader :__required_context__
43
+
44
+ # @return [Object]
45
+ #
46
+ # @since 0.1.0
47
+ attr_reader :__outer_context__
48
+
49
+ # @return [Proc]
50
+ #
51
+ # @since 0.1.0
52
+ attr_reader :__clojure__
53
+
54
+ # @param required_context [Object]
55
+ # @param clojure [Proc]
56
+ #
57
+ # @since 0.1.0
58
+ def initialize(required_context, clojure)
59
+ ::Kernel.raise NonProcClojureObjectError unless clojure.is_a?(::Proc)
60
+
61
+ @__required_context__ = required_context
62
+ @__outer_context__ = ::Kernel.eval('self', clojure.binding)
63
+ @__clojure__ = clojure
64
+ end
65
+
66
+ # @return [Object]
67
+ #
68
+ # @see #method_missing
69
+ #
70
+ # @since 0.1.0
71
+ def evaluate
72
+ instance_eval(&__clojure__)
73
+ end
74
+
75
+ # @see #evaluate
76
+ #
77
+ # @since 0.1.0
78
+ def method_missing(method_name, *arguments, &block)
79
+ case
80
+ when __outer_context__.respond_to?(method_name)
81
+ __outer_context__.public_send(method_name, *arguments, &block)
82
+ when __required_context__.respond_to?(method_name)
83
+ __required_context__.public_send(method_name, *arguments, &block)
84
+ else
85
+ super
86
+ end
87
+ end
88
+
89
+ # @see #method_missing
90
+ #
91
+ # @since 0.1.0
92
+ def respond_to_missing?(method_name, include_private = false)
93
+ __outer_context__.respond_to?(method_name) ||
94
+ __required_context__.respond_to?(method_name) || super
95
+ end
96
+
97
+ # @see #method_missing
98
+ # @see #respond_to_missing?
99
+ #
100
+ # @since 0.1.0
101
+ def method(method_name)
102
+ case
103
+ when __outer_context__.respond_to?(method_name)
104
+ __outer_context__.method(method_name)
105
+ when __required_context__.respond_to?(method_name)
106
+ __required_context__.method(method_name)
107
+ else
108
+ super
109
+ end
110
+ end
111
+ end
112
+ end
113
+ end
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ module EvilEvents
4
+ module Shared
5
+ # @example
6
+ # require 'securerandom'
7
+ #
8
+ # class Event
9
+ # extend EvilEvents::Shared::CombinedContextMixin
10
+ #
11
+ # class << self
12
+ # def type(type = nil)
13
+ # @type = type if type
14
+ # @type
15
+ # end
16
+ # end
17
+ # end
18
+ #
19
+ # def get_uuid
20
+ # SecureRandom.uuid
21
+ # end
22
+ #
23
+ # MyEvent = Event.evaluate do
24
+ # type get_uuid # Event.type + binding#get_uuid => works good :)
25
+ # end
26
+ #
27
+ # @see EvilEvents::Shared::CombinedContext
28
+ #
29
+ # @since 0.1.0
30
+ # @api public
31
+ module CombinedContextMixin
32
+ # @param clojure [Proc]
33
+ # @return [Object] Clojure evaluation result
34
+ #
35
+ # @see EvilEvents::Shared::CombinedContext#evaluate
36
+ #
37
+ # @since 0.1.0
38
+ def evaluate(&clojure)
39
+ CombinedContext.new(self, clojure).evaluate
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ module EvilEvents::Shared
4
+ # @api public
5
+ # @since 0.1.0
6
+ Configurable = Dry::Configurable
7
+ end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ module EvilEvents::Shared
4
+ # @example
5
+ # DelegatorResolver.new(-> { 'test' }).delegator # => 'test'
6
+ # DelegatorResolver.new('test') # => InvalidProcAttributeError
7
+ #
8
+ # @since 0.1.0
9
+ # @api public
10
+ class DelegatorResolver
11
+ # @since 0.1.0
12
+ DelegatorResolverError = Class.new(StandardError)
13
+ # @since 0.1.0
14
+ InvalidProcAttributeError = Class.new(DelegatorResolverError)
15
+
16
+ # @return [Proc]
17
+ #
18
+ # @since 0.1.0
19
+ attr_reader :method_name_resolver
20
+
21
+ # @param method_name_resolver [Proc]
22
+ #
23
+ # @since 0.1.0
24
+ def initialize(method_name_resolver)
25
+ raise InvalidProcAttributeError unless method_name_resolver.is_a?(Proc)
26
+ @method_name_resolver = method_name_resolver
27
+ end
28
+
29
+ # @return [String, Symbol]
30
+ #
31
+ # @since 0.1.0
32
+ def delegator
33
+ @delegator ||= method_name_resolver.call
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ module EvilEvents::Shared
4
+ # @api public
5
+ # @since 0.1.0
6
+ DependencyContainer = Dry::Container
7
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module EvilEvents::Shared
4
+ # @api public
5
+ # @since 0.1.0
6
+ class Logger < ::Logger
7
+ # @since 0.1.0
8
+ def initialize(*, **)
9
+ super
10
+ self.level = :info
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ module EvilEvents::Shared
4
+ # @api public
5
+ # @since 0.1.0
6
+ module MockableClassBuilder
7
+ class << self
8
+ # @param class_definitions [Proc]
9
+ # @return [Class]
10
+ #
11
+ # @since 0.1.0
12
+ def new_class(&class_definitions)
13
+ Class.new.tap do |klass|
14
+ klass.class_eval(&class_definitions) if block_given?
15
+
16
+ klass.singleton_class.class_eval do
17
+ define_method :build_mock do
18
+ ::Class.new.tap do |mocking_class|
19
+ mocking_class.class_eval(&class_definitions)
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ module EvilEvents::Shared
4
+ # @api public
5
+ # @since 0.1.0
6
+ Structure = Dry::Struct
7
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ module EvilEvents::Shared
4
+ # @api public
5
+ # @since 0.1.0
6
+ module Types
7
+ include Dry::Types.module
8
+ end
9
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module EvilEvents
4
+ # @since 0.1.0
5
+ module Shared
6
+ require_relative 'shared/mockable_class_builder'
7
+ require_relative 'shared/logger'
8
+ require_relative 'shared/configurable'
9
+ require_relative 'shared/dependency_container'
10
+ require_relative 'shared/structure'
11
+ require_relative 'shared/types'
12
+ require_relative 'shared/combined_context'
13
+ require_relative 'shared/combined_context_mixin'
14
+ require_relative 'shared/delegator_resolver'
15
+ end
16
+ end
@@ -0,0 +1,70 @@
1
+ # frozen_string_literal: true
2
+
3
+ # @api public
4
+ # @since 0.1.0
5
+ class EvilEvents::System
6
+ # @see EvilEvents::System
7
+ # @api public
8
+ # @since 0.1.0
9
+ class Mock
10
+ # @see EvilEvents::System
11
+ # @since 0.1.0
12
+ attr_reader :event_emitter
13
+
14
+ # @see EvilEvents::System
15
+ # @since 0.1.0
16
+ attr_reader :manager_registry
17
+
18
+ # @see EvilEvents::System
19
+ # @since 0.1.0
20
+ def observe(event_class, raw_subscriber, delegator); end
21
+
22
+ # @see EvilEvents::System
23
+ # @since 0.1.0
24
+ def raw_observe(event_type, raw_subscriber, delegator); end
25
+
26
+ # @see EvilEvents::System
27
+ # @since 0.1.0
28
+ def observers(event_class); end
29
+
30
+ # @see EvilEvents::System
31
+ # @since 0.1.0
32
+ def emit(event); end
33
+
34
+ # @see EvilEvents::System
35
+ # @since 0.1.0
36
+ def raw_emit(event_type, **event_attributes); end
37
+
38
+ # @see EvilEvents::System
39
+ # @since 0.1.0
40
+ def resolve_adapter(adapter_name); end
41
+
42
+ # @see EvilEvents::System
43
+ # @since 0.1.0
44
+ def register_event_class(event_class); end
45
+
46
+ # @see EvilEvents::System
47
+ # @since 0.1.0
48
+ def unregister_event_class(event_class); end
49
+
50
+ # @see EvilEvents::System
51
+ # @since 0.1.0
52
+ def manager_of(event); end
53
+
54
+ # @see EvilEvents::System
55
+ # @since 0.1.0
56
+ def manager_of_event_type(event_type); end
57
+
58
+ # @see EvilEvents::System
59
+ # @since 0.1.0
60
+ def resolve_event_object(event_type, **event_attributes); end
61
+
62
+ # @see EvilEvents::System
63
+ # @since 0.1.0
64
+ def define_event_class(event_type, &event_class_definitions); end
65
+
66
+ # @see EvilEvents::System
67
+ # @since 0.1.0
68
+ def define_abstract_event_class(event_type); end
69
+ end
70
+ end
@@ -0,0 +1,149 @@
1
+ # frozen_string_literal: true
2
+
3
+ # @api private
4
+ # @since 0.1.0
5
+ class EvilEvents::System
6
+ class << self
7
+ # @return [EvilEvents::System::Mock]
8
+ #
9
+ # @since 0.1.0
10
+ def build_mock
11
+ Mock.new
12
+ end
13
+
14
+ # @return [EvilEvents::System]
15
+ #
16
+ # @since 0.1.0
17
+ def build_stub
18
+ new
19
+ end
20
+ end
21
+
22
+ # @since 0.1.0
23
+ attr_reader :event_emitter
24
+
25
+ # @since 0.1.0
26
+ attr_reader :manager_registry
27
+
28
+ # @since 0.1.0
29
+ def initialize
30
+ @manager_registry = EvilEvents::Core::Events::ManagerRegistry.new
31
+ @event_emitter = EvilEvents::Core::Broadcasting::Emitter.new
32
+ end
33
+
34
+ # @param event_class [Class{Evilevents::Core::Events::AbstractEvent}]
35
+ # @param raw_subscriber [Object]
36
+ # @param delegator [String, Symbol, NilClass]
37
+ # @return void
38
+ #
39
+ # @since 0.1.0
40
+ def observe(event_class, raw_subscriber, delegator)
41
+ manager_registry.manager_of_event(event_class)
42
+ .observe(raw_subscriber, delegator)
43
+ end
44
+
45
+ # @param event_type [String, Symbol]
46
+ # @param raw_subscriber [Object]
47
+ # @param delegator [String, Symbol, NilClass]
48
+ # @return void
49
+ #
50
+ # @since 0.1.0
51
+ def raw_observe(event_type, raw_subscriber, delegator)
52
+ manager_registry.manager_of_event_type(event_type)
53
+ .observe(raw_subscriber, delegator)
54
+ end
55
+
56
+ # @param event_class [Class{EvilEvents::Core::Events::AbstractEvent}]
57
+ # @return [Array<EvilEvents::Core::Events::Subscriber>]
58
+ #
59
+ # @since 0.1.0
60
+ def observers(event_class)
61
+ manager_registry.manager_of_event(event_class).subscribers
62
+ end
63
+
64
+ # @param event [EvilEvents::Core::Events::AbstractEvent]
65
+ # @return void
66
+ #
67
+ # @since 0.1.0
68
+ def emit(event)
69
+ event_emitter.emit(event)
70
+ end
71
+
72
+ # @param event_type [String]
73
+ # @param event_attributes [Hash]
74
+ # @return void
75
+ #
76
+ # @since 0.1.0
77
+ def raw_emit(event_type, **event_attributes)
78
+ event_emitter.raw_emit(event_type, **event_attributes)
79
+ end
80
+
81
+ # @param adapter_name [Symbol, String]
82
+ # @return [EvilEvents::Core::Broadcasting::Dispatcher::Dispatchable]
83
+ #
84
+ # @since 0.1.0
85
+ def resolve_adapter(adapter_name)
86
+ EvilEvents::Core::Broadcasting::Adapters.resolve(adapter_name)
87
+ end
88
+
89
+ # @param event_class [Class{EvilEvents::Core::Events::AbstractEvent}]
90
+ # @return void
91
+ #
92
+ # @since 0.1.0
93
+ def register_event_class(event_class)
94
+ manager_registry.register_with(event_class)
95
+ end
96
+
97
+ # @param event_class [Class{EvilEvents::Core::events::AbstractEvent}]
98
+ # @return void
99
+ #
100
+ # @since 0.1.0
101
+ def unregister_event_class(event_class)
102
+ manager_registry.unregister_with(event_class)
103
+ end
104
+
105
+ # @param event [EvilEvents::Core::Events::AbstractEvent]
106
+ # @return [EvilEvents::Core::Events::Manager]
107
+ #
108
+ # @since 0.1.0
109
+ def manager_of_event(event)
110
+ manager_registry.manager_of_event(event.class)
111
+ end
112
+
113
+ # @param event_type [String]
114
+ # @return [EvilEvents::Core::Events::Manager]
115
+ #
116
+ # @since 0.1.0
117
+ def manager_of_event_type(event_type)
118
+ manager_registry.manager_of_event_type(event_type)
119
+ end
120
+
121
+ # @param event_type [String]
122
+ # @param event_attributes [Hash]
123
+ # @return [EvilEvents::Core::Events::AbstractEvent]
124
+ #
125
+ # @since 0.1.0
126
+ def resolve_event_object(event_type, **event_attributes)
127
+ manager_of_event_type(event_type).event_class.new(**event_attributes)
128
+ end
129
+
130
+ # @param event_class_definitions [Proc]
131
+ # @return [Class{EvilEvents::Core::Events::AbstractEvent}]
132
+ #
133
+ # @since 0.1.0
134
+ def define_event_class(event_type, &event_class_definitions)
135
+ EvilEvents::Core::Events::EventClassFactory.create(
136
+ event_type, &event_class_definitions
137
+ )
138
+ end
139
+
140
+ # @param event_type [String]
141
+ # @return [Class{EvilEvents::Core::Events::AbstractEvent}]
142
+ #
143
+ # @since 0.1.0
144
+ def define_abstract_event_class(event_type)
145
+ EvilEvents::Core::Events::EventClassFactory.create_abstract(
146
+ event_type
147
+ )
148
+ end
149
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ module EvilEvents
4
+ # @api public
5
+ # @since 0.1.0
6
+ VERSION = '0.1.0rc1'
7
+ end
@@ -0,0 +1,53 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'dry-configurable'
4
+ require 'dry-container'
5
+ require 'dry-struct'
6
+ require 'dry-types'
7
+ require 'concurrent'
8
+ require 'logger'
9
+ require 'json'
10
+
11
+ # @api public
12
+ # @since 0.1.0
13
+ module EvilEvents
14
+ require_relative 'evil_events/shared'
15
+ require_relative 'evil_events/core'
16
+ require_relative 'evil_events/system'
17
+ require_relative 'evil_events/system/mock'
18
+ require_relative 'evil_events/config'
19
+ require_relative 'evil_events/boot_point'
20
+ require_relative 'evil_events/version'
21
+
22
+ # @since 0.1.0
23
+ Types = Shared::Types
24
+
25
+ class << self
26
+ # @see EvilEvents::System
27
+ # @api public
28
+ # @since 0.1.0
29
+ def [](event_type)
30
+ EvilEvents::BootPoint::System[:event_system].define_abstract_event_class(
31
+ event_type
32
+ )
33
+ end
34
+
35
+ # @see EvilEvents::System
36
+ # @api public
37
+ # @since 0.1.0
38
+ def define_event(event_type, &event_class_definitions)
39
+ EvilEvents::BootPoint::System[:event_system].define_event_class(
40
+ event_type, &event_class_definitions
41
+ )
42
+ end
43
+
44
+ # @see EvilEvents::System
45
+ # @api public
46
+ # @since 0.1.0
47
+ def emit(event_type, **event_attributes)
48
+ EvilEvents::BootPoint::System[:event_system].raw_emit(
49
+ event_type, **event_attributes
50
+ )
51
+ end
52
+ end
53
+ end