Module: ROM::Command::ClassInterface
- Included in:
- ROM::Command
- Defined in:
- lib/rom/commands/class_interface.rb
Class Method Summary collapse
-
.extended(klass) ⇒ Object
private
Sets up the base class.
Instance Method Summary collapse
-
#[](adapter) ⇒ Class
Return adapter specific sub-class based on the adapter identifier.
-
#adapter ⇒ Symbol
Return configured adapter identifier.
-
#adapter_namespace(adapter) ⇒ Module
private
Return namespaces that contains command subclasses of a specific adapter.
-
#after(*hooks) ⇒ Array<Hash, Symbol>
Set after-execute hooks.
-
#before(*hooks) ⇒ Array<Hash, Symbol>
Set before-execute hooks.
-
#build(relation, **options) ⇒ Command
Build a command class for a specific relation with options.
-
#create_class(type: self, meta: {}, rel_meta: {}, plugins: {}) {|Class| ... } ⇒ Class, Object
Create a command class with a specific type.
-
#default_name ⇒ Symbol
private
Return default name of the command class based on its name.
-
#inherited(klass) ⇒ Object
private
This hook sets up default class state.
-
#set_hooks(type, hooks) ⇒ Object
private
Set new or more hooks.
Class Method Details
.extended(klass) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Sets up the base class
23 24 25 26 27 |
# File 'lib/rom/commands/class_interface.rb', line 23 def self.extended(klass) super klass.set_hooks(:before, []) klass.set_hooks(:after, []) end |
Instance Method Details
#[](adapter) ⇒ Class
Return adapter specific sub-class based on the adapter identifier
This is a syntax sugar to make things consistent
42 43 44 |
# File 'lib/rom/commands/class_interface.rb', line 42 def [](adapter) adapter_namespace(adapter).const_get(Inflector.demodulize(name)) end |
#adapter ⇒ Symbol
Return configured adapter identifier
117 118 119 |
# File 'lib/rom/commands/class_interface.rb', line 117 def adapter config.component.adapter end |
#adapter_namespace(adapter) ⇒ Module
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Return namespaces that contains command subclasses of a specific adapter
53 54 55 56 57 |
# File 'lib/rom/commands/class_interface.rb', line 53 def adapter_namespace(adapter) ROM.adapters.fetch(adapter).const_get(:Commands) rescue KeyError raise AdapterNotPresentError.new(adapter, :relation) end |
#after(hook) ⇒ Array<Hash, Symbol> #after(hook_opts) ⇒ Array<Hash, Symbol>
Set after-execute hooks
203 204 205 206 207 208 209 |
# File 'lib/rom/commands/class_interface.rb', line 203 def after(*hooks) if hooks.empty? @after else set_hooks(:after, hooks) end end |
#before(hook) ⇒ Array<Hash, Symbol> #before(hook_opts) ⇒ Array<Hash, Symbol>
Set before-execute hooks
158 159 160 161 162 163 164 |
# File 'lib/rom/commands/class_interface.rb', line 158 def before(*hooks) if hooks.empty? @before else set_hooks(:before, hooks) end end |
#build(relation, **options) ⇒ Command
Build a command class for a specific relation with options
73 74 75 |
# File 'lib/rom/commands/class_interface.rb', line 73 def build(relation, **) new(relation, **) end |
#create_class(type: self, meta: {}, rel_meta: {}, plugins: {}) {|Class| ... } ⇒ Class, Object
Create a command class with a specific type
87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 |
# File 'lib/rom/commands/class_interface.rb', line 87 def create_class(type: self, meta: {}, rel_meta: {}, plugins: {}, **, &block) klass = Dry::Core::ClassBuilder.new(name: type.name, parent: type).call result = .fetch(:result, :one) klass.config.result = .fetch(:combine_type, result) .each do |name, value| if klass.respond_to?(name) klass.public_send(name, value) else klass.config[name] = value end end plugins.each do |plugin, | klass.use(plugin, **) end if block yield(klass) else klass end end |
#default_name ⇒ Symbol
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Return default name of the command class based on its name
During setup phase this is used by defalut as register_as
option
231 232 233 |
# File 'lib/rom/commands/class_interface.rb', line 231 def default_name Inflector.underscore(Inflector.demodulize(name)).to_sym end |
#inherited(klass) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
This hook sets up default class state
14 15 16 17 18 |
# File 'lib/rom/commands/class_interface.rb', line 14 def inherited(klass) super klass.instance_variable_set(:@before, before.dup) klass.instance_variable_set(:@after, after.dup) end |
#set_hooks(type, hooks) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Set new or more hooks
214 215 216 217 218 219 220 221 222 |
# File 'lib/rom/commands/class_interface.rb', line 214 def set_hooks(type, hooks) ivar = :"@#{type}" if instance_variable_defined?(ivar) instance_variable_get(ivar).concat(hooks) else instance_variable_set(ivar, hooks) end end |