Module: Usable

Defined in:
lib/usable.rb,
lib/usable/config.rb,
lib/usable/version.rb,
lib/usable/mod_extender.rb

Defined Under Namespace

Classes: Config, ModExtender

Constant Summary collapse

VERSION =
"2.0.0".freeze

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#usablesObject



30
31
32
33
34
# File 'lib/usable.rb', line 30

def usables
  @usables ||= Config.new
  return @usables unless block_given?
  @usables.instance_eval &Proc.new
end

Class Method Details

.extended(base) ⇒ Object



10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# File 'lib/usable.rb', line 10

def self.extended(base)
  base.class_eval do
    def usables
      self.class.usables
    end

    def usable_method(method_name)
      self.class.usable_method(self, method_name)
    end
  end
  unless base.is_a? Class
    base.instance_eval do
      def config(&block)
        usables(&block)
      end unless defined? config
    end
  end
end

Instance Method Details

#usable(mod, options = {}, &block) ⇒ ModExtender

Note:

Hides methods

Note:

We include the primary mod when there is a UsableSpec set because any instance methods defined on the mod are not configurable and should therefore takes precedence over those defined in the UsableSpec

Returns containing the original and modified module.

Examples:


class Example
  extend Usable
  usable Mixin, only: [:foo, :bar] do
    baz "Available as `Example.usables.baz` or `Example.usables.mixin.baz`"
  end
end


60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
# File 'lib/usable.rb', line 60

def usable(mod, options = {}, &block)
  usable_options = { only: options.delete(:only), method: options.delete(:method) }
  # Define settings on @usables and on the scoped @usables
  scope = Config.new
  if mod.name
    scope_name = mod.name.split('::').last.gsub(/\B([A-Z])([a-z_0-9])/, '_\1\2').downcase
    usables[scope_name] = scope
  end
  if mod.respond_to? :usables
    mod.usables.each do |k, v|
      [scope, usables].each { |x| x.spec k, v }
    end
  end
  [scope, usables].each { |x| options.each { |k, v| x[k] = v } }
  [scope, usables].each { |x| x.instance_eval &block } if block_given?
  # Include module
  mod_ext = ModExtender.new mod, usable_options
  mod_ext.use! self
  mod_ext.use_original! self
  mod_ext.use_class_methods! self
  mod_ext
end

#usable_method(context, method_name) ⇒ Method



84
85
86
# File 'lib/usable.rb', line 84

def usable_method(context, method_name)
  usables.available_methods[method_name].bind(context)
end