lib/usable/mod_extender.rb in usable-2.0.0 vs lib/usable/mod_extender.rb in usable-2.1.0
- old
+ new
@@ -1,64 +1,51 @@
module Usable
class ModExtender
- SPEC = :UsableSpec
- CLASS_MODULE = :ClassMethods
-
attr_reader :name
attr_accessor :copy, :mod, :options, :unwanted
def initialize(mod, options = {})
@mod = mod
@options = options
@options[:method] ||= :include
- if has_spec?
- @copy = mod.const_get SPEC
- @name = "#{mod.name}UsableSpec"
- else
- @copy = mod
- @name = mod.name
- end
+ @copy = mod
+ @name = mod.name
@unwanted = options[:only] ? @copy.instance_methods - Array(options[:only]) : []
if @unwanted.any?
@copy = @copy.dup
end
end
- # @note Destructive, as it changes @copy
- def override
- unwanted.each do |method_name|
- copy.send :remove_method, method_name
- end
- end
-
# @description Directly include a module whose methods you want made available in +usables.available_methods+
# Gives the module a name when including so that it shows up properly in the list of ancestors
- def use!(target)
+ def call(target)
override
if copy.name.nil?
const_name = "#{mod_name}Used"
target.send :remove_const, const_name if target.const_defined? const_name, false
target.const_set const_name, copy
end
target.usables.add_module copy
target.send options[:method], copy
end
- # @description Includes or prepends the original module onto the target
- def use_original!(target)
- return unless has_spec?
- target.usables.add_module mod
- target.send options[:method], mod
+ # @note Destructive, as it changes @copy
+ def override
+ unwanted.each do |method_name|
+ copy.send :remove_method, method_name
+ end
end
# @description Extends the target with the module's ClassMethod mod
def use_class_methods!(target)
- return unless mod.const_defined? CLASS_MODULE
- target.extend mod.const_get CLASS_MODULE
+ return unless mod.const_defined? :ClassMethods
+ target.extend mod.const_get :ClassMethods
end
- def has_spec?
- mod.const_defined? SPEC
+ # @description Extends the target with the module's ClassMethod mod
+ def use_instance_methods!(target)
+ return unless mod.const_defined? :InstanceMethods
+ target.include mod.const_get :InstanceMethods
end
def mod_name
if name
name.split('::').last