DSL

Description

Helpers for the creation of Domain Specific Languages within your libraries and gems.

Install

Bundler

gem 'dsl'

RubyGems

gem install dsl

Usage

Simple

class Character
  class AttributeDSL < DSL
    def_dsl :name, :age, :gender
  end

  attr_reader :name, :age, :gender

  def initialize(&blk)
    dsl = AttributeDSL.call(&blk)

    @name, @age, @gender = dsl.name, dsl.age, dsl.gender

    # OR:
    # @name, @age, @gender = dsl.to_h.values_at(:name, :age, :gender)
  end
end

Character.new do
  name 'John Doe'
  age 21
  gender :male
end

Advanced

class Character
  class AttributeDSL < DSL
    def_dsl :name do
      get do |value|
        value.split(' ').first.capitalize # Only return the first name, even if the person has a last name as well
      end

      set do |value| # The instance variable will be set to the result of this block
        raise 'name must be a String' unless value.respond_to?(:to_s)

        value.to_s
      end
    end
  end

  attr_reader :name

  def initialize(&blk)
    dsl = AttributeDSL.call(&blk)

    @name = dsl.name

    # OR:
    # @name, @age, @gender = dsl.to_h.values_at(:name, :age, :gender)
  end
end

Character.new do
  name 1234 # Error: name must be a String
end

License

Copyright (c) 2010-2012 Ryan Lewis. See LICENSE for details.