Module: StoryTeller::ModelAdapter
- Defined in:
- lib/story_teller/model_adapter.rb
Overview
The ModelAdapter module
Constant Summary collapse
- RequiredAdapterKeys =
%i[name object_class tag_class link_class module_class].freeze
- ExcludedObjectModelModuleNames =
['Inform::Context'].freeze
- Registry =
Struct.new(:memo).new(nil)
Class Method Summary collapse
- .adapt_object_class!(klass) ⇒ Object
- .available? ⇒ Boolean
- .current ⇒ Object
- .current=(adapter) ⇒ Object
- .link_class ⇒ Object
- .link_class! ⇒ Object
- .module_class ⇒ Object
- .module_class! ⇒ Object
- .object_class ⇒ Object
- .object_class! ⇒ Object
- .object_model_module?(ancestor) ⇒ Boolean
- .object_model_modules ⇒ Object
- .register!(adapter) ⇒ Object
- .tag_class ⇒ Object
- .tag_class! ⇒ Object
- .validate!(adapter) ⇒ Object
Class Method Details
.adapt_object_class!(klass) ⇒ Object
63 64 65 66 67 68 |
# File 'lib/story_teller/model_adapter.rb', line 63 def adapt_object_class!(klass) object_model_modules.reverse_each do |mod| klass.include(mod) unless klass < mod end klass end |
.available? ⇒ Boolean
85 86 87 |
# File 'lib/story_teller/model_adapter.rb', line 85 def available? !current.nil? end |
.current ⇒ Object
31 32 33 |
# File 'lib/story_teller/model_adapter.rb', line 31 def current Registry.memo end |
.current=(adapter) ⇒ Object
36 37 38 |
# File 'lib/story_teller/model_adapter.rb', line 36 def current=(adapter) Registry.memo = adapter end |
.link_class ⇒ Object
100 101 102 |
# File 'lib/story_teller/model_adapter.rb', line 100 def link_class current&.fetch(:link_class, nil) end |
.link_class! ⇒ Object
120 121 122 |
# File 'lib/story_teller/model_adapter.rb', line 120 def link_class! link_class || raise(NotImplementedError, 'No link model adapter has been registered') end |
.module_class ⇒ Object
105 106 107 |
# File 'lib/story_teller/model_adapter.rb', line 105 def module_class current&.fetch(:module_class, nil) end |
.module_class! ⇒ Object
125 126 127 |
# File 'lib/story_teller/model_adapter.rb', line 125 def module_class! module_class || raise(NotImplementedError, 'No module model adapter has been registered') end |
.object_class ⇒ Object
90 91 92 |
# File 'lib/story_teller/model_adapter.rb', line 90 def object_class current&.fetch(:object_class, nil) end |
.object_class! ⇒ Object
110 111 112 |
# File 'lib/story_teller/model_adapter.rb', line 110 def object_class! object_class || raise(NotImplementedError, 'No object model adapter has been registered') end |
.object_model_module?(ancestor) ⇒ Boolean
80 81 82 |
# File 'lib/story_teller/model_adapter.rb', line 80 def object_model_module?(ancestor) ancestor.is_a?(Module) && !ExcludedObjectModelModuleNames.include?(ancestor.name) end |
.object_model_modules ⇒ Object
71 72 73 74 75 76 77 |
# File 'lib/story_teller/model_adapter.rb', line 71 def object_model_modules return [] unless defined?(Inform::Object) ancestors = Inform::Object.ancestors superclass_index = ancestors.index(Inform::Object.superclass) ancestors[1...superclass_index].select { |ancestor| object_model_module?(ancestor) } end |
.register!(adapter) ⇒ Object
41 42 43 44 45 |
# File 'lib/story_teller/model_adapter.rb', line 41 def register!(adapter) validate!(adapter) adapt_object_class!(adapter.fetch(:object_class)) self.current = adapter.freeze end |
.tag_class ⇒ Object
95 96 97 |
# File 'lib/story_teller/model_adapter.rb', line 95 def tag_class current&.fetch(:tag_class, nil) end |
.tag_class! ⇒ Object
115 116 117 |
# File 'lib/story_teller/model_adapter.rb', line 115 def tag_class! tag_class || raise(NotImplementedError, 'No tag model adapter has been registered') end |
.validate!(adapter) ⇒ Object
48 49 50 51 52 53 54 55 56 57 58 59 60 |
# File 'lib/story_teller/model_adapter.rb', line 48 def validate!(adapter) missing = RequiredAdapterKeys.reject { |key| adapter.key?(key) } raise ArgumentError, "Model adapter is missing keys: #{missing.join(', ')}" unless missing.empty? %i[object_class tag_class link_class module_class].each do |key| value = adapter.fetch(key) next if value.is_a?(Class) raise ArgumentError, "Model adapter #{key} must be a Class" end adapter end |