Skip to content

Instantly share code, notes, and snippets.

@cavebatsofware
Created November 20, 2012 20:24
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save cavebatsofware/4120821 to your computer and use it in GitHub Desktop.
Save cavebatsofware/4120821 to your computer and use it in GitHub Desktop.
weight classes
class Weight
def method_missing(method_id)
return nil if self.class == Weight
name = method_id.id2name
result = nil
if name =~ /^to_(\w+)s$/
klass = eval $1.capitalize
result = klass.from_ounces(self.to_ounces)
elsif name =~ /^in_(\w+)s$/
klass = eval $1.capitalize
result = klass.from_ounces(self.to_ounces).value
end
result
end
def +(value)
result = nil
if value.is_a? Weight
result = new_from_ounces(in_ounces + value.in_ounces)
else
result = new_me(self.value + value.to_f)
end
result
end
def -(value)
result = nil
if value.is_a? Weight
result = new_from_ounces(in_ounces - value.in_ounces)
else
result = new_me(self.value - value.to_f)
end
result
end
def /(value)
result = nil
if value.is_a? Weight
result = new_from_ounces(in_ounces / value.in_ounces)
else
result = new_me(self.value / value.to_f)
end
result
end
def *(value)
result = nil
if value.is_a? Weight
result = new_from_ounces(in_ounces * value.in_ounces)
else
result = new_me(self.value * value.to_f)
end
result
end
def %(value)
result = nil
if value.is_a? Weight
result = new_from_ounces(in_ounces % value.in_ounces)
else
result = new_me(self.value % value.to_f)
end
result
end
def **(value)
result = nil
if value.is_a? Weight
result = new_from_ounces(in_ounces ** value.in_ounces)
else
result = new_me(self.value ** value.to_f)
end
result
end
def ==(value)
result = false
if value.is_a? Weight
result = in_ounces == value.in_ounces
else
result = self.value == value.to_f
end
result
end
def <(value)
result = nil
if value.is_a? Weight
result = in_ounces < value.in_ounces
else
result = self.value < value.to_f
end
result
end
def >(value)
result = nil
if value.is_a? Weight
result = in_ounces > value.in_ounces
else
result = self.value > value.to_f
end
result
end
def <=(value)
result = nil
if value.is_a? Weight
result = in_ounces <= value.in_ounces
else
result = self.value <= value.to_f
end
result
end
def >=(value)
result = nil
if value.is_a? Weight
result = in_ounces >= value.in_ounces
else
result = self.value >= value.to_f
end
result
end
def <=>(value)
result = false
if value.is_a? Weight
result = in_ounces <=> value.in_ounces
else
result = self.value <=> value
end
result
end
def to_i
@value.ceil.to_i
end
def to_f
@value.round(2)
end
def to_s
result = nil
unless @value > 1.0
result = to_f.to_s + unit.to_s
else
result = to_f.to_s + unit.to_s + 's'
end
result
end
def coerce(value)
result = []
if value.is_a? Weight
result = [new_from_ounces(value.in_ounces), self]
else
result = [new_me(value), self]
end
end
def value
@value.round(2)
end
def value=(value)
if value.is_a? Weight
@value = new_from_ounces(value.in_ounces).value
else
@value = value.to_f
end
end
def unit
@unit
end
protected
def initialize(value)
@value = value.to_f if value
@value ||= 0.0
end
def unit=(value)
@unit = value.to_sym
end
def new_me(value)
self.class.new value
end
def new_from_ounces(value)
self.class.from_ounces(value)
end
end
class Pound < Weight
def initialize(value)
super(value)
self.unit = :lb
end
def to_ounces
self.value * 16.0
end
def self.from_ounces(ounces)
Pound.new(ounces / 16.0)
end
end
class Ounce < Weight
def initialize(value)
super(value)
self.unit = :oz
end
def to_ounces
self.value
end
def self.from_ounces(ounces)
Ounce.new(ounces)
end
end
class Kilogram < Weight
def initialize(value)
super(value)
self.unit = :kg
end
def to_ounces
self.value * 35.274
end
def self.from_ounces(ounces)
Kilogram.new(ounces / 35.274)
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment