lib/inch/evaluation/role.rb
module Inch
module Evaluation
# Role objects are assigned to evaluations of code objects. They describe
# the object they are attached to.
# @abstract
class Role
attr_reader :object
class << self
def applicable_if(symbol = nil, &block)
@applicable_procs ||= {}
@applicable_procs[to_s] = block || symbol.to_proc
end
def applicable_unless(symbol = nil, &block)
@applicable_procs ||= {}
@applicable_procs[to_s] = proc do |object|
!(block || symbol.to_proc).call(object)
end
end
def applicable?(object)
@applicable_procs ||= {}
@applicable_procs[to_s].call(object)
end
def priority(value)
define_method(:priority) { value }
end
end
# @param object [Codebase::Object] the object to evaluate
# @param value [Float] a score that might be added by this role
def initialize(object, value = nil)
@object = object
@value = value
end
# Returns a maximal score for the object.
# The final score can not be higher than this.
# @note Override this method to that a max_score for the evaluation.
# @return [Float]
def max_score
end
# Returns a minimal score for the object.
# The final score can not be lower than this.
# @note Override this method to that a min_score for the evaluation.
# @return [Float]
def min_score
end
# Returns a score that will be added to the associated object's
# overall score.
#
# @note Override this method to assign a score for the role
# @return [Float]
def score
@value.to_f
end
# Returns a potential score that would be added to the overall score
# if the object had implemented the Role's subject.
#
# @see Role::Missing
# @note Override this method to assign a potential score for the role
# @return [Float]
def potential_score
nil
end
# Returns a priority that will be added to the associated object's
# overall priority.
#
# @note Override this method to assign a priority for the role
# @return [Fixnum]
def priority
0
end
# Returns a suggestion to achieve the potential score that would be
# added to the overall score if the object had implemented the Role's
# subject.
#
# @see Role::Missing
# @return [String]
def suggestion
nil
end
# Returns the type of the +object+ that is being evaluated.
#
# @return [String]
def object_type
fail NotImplementedError
end
end
end
end