Skip to content

Instantly share code, notes, and snippets.

@tysonmote
Created November 10, 2010 23:49
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 tysonmote/671739 to your computer and use it in GitHub Desktop.
Save tysonmote/671739 to your computer and use it in GitHub Desktop.
Less hacky options hash
module Optionize
class AlreadyDefinedError < StandardError; end
def self.included( base )
base.extend ClassMethods
end
module ClassMethods
def optionize( key, opts={} )
getter = key
setter = "#{key}="
if method_defined?( getter ) || method_defined?( setter )
raise AlreadyDefinedError
end
# Getter
define_method getter do
result = self.options[ key ]
result ||= opts[ :default ]
result = result.send( opts[:get] ) if opts[:get]
result
end
# Setter
define_method setter do |value|
value = value.send( opts[:set] ) if opts[:set]
self.options = self.options.merge key => value
end
end
end
end
class Job
attr_accessor :options
include Optionize
optionize :tyson_is_rad, :default => 10, :get => :to_i, :set => :to_s
def options
@options ||= {}
end
end
j = Job.new
p "default = #{j.tyson_is_rad}"
j.tyson_is_rad = "123"
p "after set = #{j.tyson_is_rad}"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment