module Trusty
module Utilities
class MethodName
attr_reader :name, :base, :convention
def initialize(name)
@name = name
@base, @convention = name.to_s.match(/\A(\w+?)(\W+)?\Z/).to_a.slice(1, 2)
end
def special?
base == nil || convention != nil
end
def named?
base != nil
end
def shorthand?
!named?
end
def boolean?
convention == '?'
end
def modifier?
convention == '!'
end
def value_for(target, *args, &block)
if target.respond_to?(name) || !target.respond_to?(base)
method_value_for(target, name, *args, &block)
else
base_value_for(target, *args, &block)
end
end
def base_value_for(target, *args, &block)
method_value_for(target, base, *args, &block)
end
def define_for(target, options = { :on => :all })
class_result = define_with_method :define_method, target unless options[:on] == :instance
instance_result = define_with_method :define_singleton_method, target unless options[:on] == :class
class_result == true || instance_result == true
end
private
def define_with_method(define_method_name, target)
if boolean? && target.respond_to?(define_method_name)
helper = self
target.send define_method_name, name do |*args, &block|
helper.base_value_for(self, *args, &block)
end
true
else
false
end
end
def method_value_for(target, method_name, *args, &block)
value = target.send(method_name, *args, &block)
if boolean?
value != nil && (!value.respond_to?(:empty?) || !value.empty?)
else
value
end
end
end
end
end