evil_events 0.1.0rc1

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.
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