class Mobility::Pluggable

Abstract Module subclass with methods to define plugins and defaults. Works with {Mobility::Plugin}. (Subclassed by {Mobility::Translations}.)

Attributes

options[R]

Public Class Methods

defaults() click to toggle source
# File lib/mobility/pluggable.rb, line 24
def defaults
  @defaults ||= {}
end
included_plugins() click to toggle source
# File lib/mobility/pluggable.rb, line 20
def included_plugins
  included_modules.grep(Plugin)
end
inherited(klass) click to toggle source
Calls superclass method
# File lib/mobility/pluggable.rb, line 28
def inherited(klass)
  super
  klass.defaults.merge!(defaults)
end
new(*, **options) click to toggle source
# File lib/mobility/pluggable.rb, line 34
def initialize(*, **options)
  initialize_options(options)
  validate_options(@options)
end
plugin(name, *args) click to toggle source
# File lib/mobility/pluggable.rb, line 12
def plugin(name, *args)
  Plugin.configure(self, defaults) { __send__ name, *args }
end
plugins(&block) click to toggle source
# File lib/mobility/pluggable.rb, line 16
def plugins(&block)
  Plugin.configure(self, defaults, &block)
end

Private Instance Methods

initialize_options(options) click to toggle source
# File lib/mobility/pluggable.rb, line 43
def initialize_options(options)
  @options = self.class.defaults.merge(options)
end
validate_options(options) click to toggle source

This is overridden by backend plugin to exclude mixed-in backend options.

# File lib/mobility/pluggable.rb, line 48
def validate_options(options)
  plugin_keys = self.class.included_plugins.map { |p| Plugins.lookup_name(p) }
  extra_keys = options.keys - plugin_keys
  raise InvalidOptionKey, "No plugin configured for these keys: #{extra_keys.join(', ')}." unless extra_keys.empty?
end