Module: DSLKit::DSLAccessor
- Included in:
- Module
- Defined in:
- lib/dslkit/polite.rb
Overview
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.
Instance Method Summary collapse
-
#dsl_accessor(name, *default, &block) ⇒ Object
This method creates a dsl accessor named name.
-
#dsl_reader(name, *default, &block) ⇒ Object
This method creates a dsl reader accessor, that behaves exactly like a #dsl_accessor but can only be read not set.
Instance Method Details
#dsl_accessor(name, *default, &block) ⇒ Object
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 ].
304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 |
# File 'lib/dslkit/polite.rb', line 304 def dsl_accessor(name, *default, &block) variable = "@#{name}" define_method(name) do |*args| if args.empty? result = instance_variable_get(variable) if result.nil? result = if default.empty? block && instance_eval(&block) elsif default.size == 1 default.first else default end instance_variable_set(variable, result) result else result end else instance_variable_set(variable, args.size == 1 ? args.first : args) end end end |
#dsl_reader(name, *default, &block) ⇒ Object
This method creates a dsl reader accessor, that behaves exactly like a #dsl_accessor but can only be read not set.
330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 |
# File 'lib/dslkit/polite.rb', line 330 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 |