Created
November 20, 2012 20:24
-
-
Save cavebatsofware/4120821 to your computer and use it in GitHub Desktop.
weight classes
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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