The DSLAccessor module contains some methods, that can be used to make simple accessors for a DSL.
class CoffeeMaker extend DSLKit::Constant constant :on constant :off extend DSLKit::DSLAccessor dsl_accessor(:state) { off } # Note: the off constant from above is used dsl_accessor :allowed_states, :on, :off def process allowed_states.include?(state) or fail "Explode!!!" if state == on puts "Make coffee." else puts "Idle..." end end end cm = CoffeeMaker.new cm.instance_eval do state # => :off state on state # => :on process # => outputs "Make coffee." end
Note that DSLKit::SymbolMaker is an alternative for DSLKit::Constant in this example. On the other hand SymbolMaker can make debugging more difficult.
This method creates a dsl accessor named name. If nothing else is given as argument it defaults to nil. If *default is given as a single value it is used as a default value, if more than one value is given the default array is used as the default value. If no default value but a block block is given as an argument, the block is executed everytime the accessor is read in the context of the current instance.
After setting up the accessor, the set or default value can be retrieved by calling the method name. To set a value one can call name :foo to set the attribute value to :foo or name(:foo, :bar) to set it to [ :foo, :bar ].
# File lib/dslkit/polite.rb, line 300 def dsl_accessor(name, *default, &block) variable = "@#{name}" define_method(name) do |*args| if args.empty? result = instance_variable_get(variable) if result.nil? if default.empty? block && instance_eval(&block) elsif default.size == 1 default.first else default end else result end else instance_variable_set(variable, args.size == 1 ? args.first : args) end end end
This method creates a dsl reader accessor, that behaves exactly like a dsl_accessor but can only be read not set.
# File lib/dslkit/polite.rb, line 324 def dsl_reader(name, *default, &block) variable = "@#{name}" define_method(name) do |*args| if args.empty? result = instance_variable_get(variable) if result.nil? if default.empty? block && instance_eval(&block) elsif default.size == 1 default.first else default end else result end else raise ArgumentError, "wrong number of arguments (#{args.size} for 0)" end end end
Disabled; run with --debug to generate this.
Generated with the Darkfish Rdoc Generator 1.1.6.