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

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