class RpgTools::Dice::Utils::ModifierCalculator

Attributes

modifiers[RW]
total[RW]

Public Class Methods

new(total, modifiers) click to toggle source
# File lib/rpg_tools/dice/utils/modifier_calculator.rb, line 7
def initialize(total, modifiers)
  @total = total
  @modifiers = modifiers

  unprocessable_modifiers if malformed_modifiers?
end

Public Instance Methods

recalculate() click to toggle source
# File lib/rpg_tools/dice/utils/modifier_calculator.rb, line 14
def recalculate
  modifier_operations.each do |operator, value|
    @total = @total.send(operator, value.to_i)
  end

  @total
end

Private Instance Methods

malformed_modifiers?() click to toggle source
# File lib/rpg_tools/dice/utils/modifier_calculator.rb, line 33
def malformed_modifiers?
  no_operator_at_modifier_beginning? ||
    no_number_at_modifier_end? ||
    multiple_successive_operators?
end
modifier_operations() click to toggle source
# File lib/rpg_tools/dice/utils/modifier_calculator.rb, line 24
def modifier_operations
  @modifiers.scan(/(\D)(\d+)/)
end
multiple_successive_operators?() click to toggle source
# File lib/rpg_tools/dice/utils/modifier_calculator.rb, line 47
def multiple_successive_operators?
  !@modifiers.match(/\d?([^0-9]{2,})\d?$/).nil?
end
no_number_at_modifier_end?() click to toggle source
# File lib/rpg_tools/dice/utils/modifier_calculator.rb, line 43
def no_number_at_modifier_end?
  @modifiers.match(/\d+$/).nil?
end
no_operator_at_modifier_beginning?() click to toggle source
# File lib/rpg_tools/dice/utils/modifier_calculator.rb, line 39
def no_operator_at_modifier_beginning?
  @modifiers.match(/^\D/).nil?
end
unprocessable_modifiers() click to toggle source
# File lib/rpg_tools/dice/utils/modifier_calculator.rb, line 28
def unprocessable_modifiers
  raise ArgumentError,
        'Modifiers require both an operator and a numerical value.'
end