module HasFlags
def method_missing(sym, *args)
type = sym.to_s[-1..-1]
if type == "?"
@_flags ||= {}
return @_flags[sym.to_s[0..-2].intern] ? true : false
end
if type == "!"
@_flags ||= {}
sym = sym.to_s[0..-2].intern
if @_flags[sym]
@_flags.delete(sym)
else
@_flags[sym] = true
end
return
end
raise
end
end
player = Object.new # Anything
player.extend(HasFlags)
# Query to see if something has flags.
if player.is_a?(HasFlags)
puts "Yeap."
end
# toggle flags
player.drunk!
player.mute!
player.anything_else_to_set!
puts player.drunk?
puts player.mute?
puts player.some_flag_never_mentioned?
# still fails on other method missings.
begin
puts player.fail()
rescue
puts "Failed."
end