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

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

Returns:

  • (Boolean)


85
86
87
# File 'lib/story_teller/model_adapter.rb', line 85

def available?
  !current.nil?
end

.currentObject



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


100
101
102
# File 'lib/story_teller/model_adapter.rb', line 100

def link_class
  current&.fetch(:link_class, nil) || (defined?(Inform::Link) ? Inform::Link : nil)
end


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_classObject



105
106
107
# File 'lib/story_teller/model_adapter.rb', line 105

def module_class
  current&.fetch(:module_class, nil) || (defined?(Inform::Module) ? Inform::Module : 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_classObject



90
91
92
# File 'lib/story_teller/model_adapter.rb', line 90

def object_class
  current&.fetch(:object_class, nil) || (defined?(Inform::Object) ? Inform::Object : 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

Returns:

  • (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_modulesObject



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_classObject



95
96
97
# File 'lib/story_teller/model_adapter.rb', line 95

def tag_class
  current&.fetch(:tag_class, nil) || (defined?(Inform::Tag) ? Inform::Tag : 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

Raises:

  • (ArgumentError)


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