module DefDsl::So

def shallow_constants who

(who.constants - who.superclass.constants).map { |name| * = name.to_s.underscore, who.const_get(name) }

end

def define_dsl! who, constants=shallow_constants(who) # …

# constants = constants.nil?? shallow_constants(who) : constants_info(constants)
return if who.included_modules.include? So
who.send :include, So
constants.each do |mini, const|

  #next if who.included_modules.include? So
  #who.send :include, So
  next if const.included_modules.include? So
  const.send :include, So
  #who.send :include, So

  define_dsl! const if const.is_a? Class

  meth =  const.instance_eval { @dsl } || mini

  who.class_eval do
    define_method(meth) do |*a,&b|
      so [mini,meth],*a,&b
    end
  end

  # const.send :include, So if const.is_a? Module # or even class
  # who.send :include, So if who.is_a? Module # or even class
  if who.class == Module
    who.send :module_function, meth
    who.send :module_function, :so
    who.send :module_function, :so1
    who.send :module_function, :so2
  end      
end

end

Public Class Methods

included(target) click to toggle source
# File lib/def_dsl.rb, line 215
def self.included target
  if target.class == Module # class.superclass for meta_module...
    target.send :module_function, :so
    target.send :module_function, :so1
    target.send :module_function, :so2
  end
end

Public Instance Methods

feed_block(&block) click to toggle source
# File lib/def_dsl.rb, line 181
def feed_block &block
  instance_eval &block
end
so(klass_name=nil,*a,&b) click to toggle source
# File lib/def_dsl.rb, line 185
def so klass_name=nil,*a,&b
  return @so if klass_name.nil?

  klass_name, label = if klass_name.is_a? Array
                        klass_name.map &:to_sym
                      else
                        [klass_name.to_sym, klass_name.to_sym]
                      end

  if self.class == Module
    klass = self.const_get(klass_name.to_s.camelize)
  else
    klass = self.class.const_get(klass_name.to_s.camelize)
  end

  obj = klass.new(*a) #,&b)
  # obj.instance_eval &b if b
  obj.feed_block &b if b
  (@so ||= {}).tap { |h| h[label] = h[label] ? [h[label], obj].flatten(1) : obj }
end
so1(name) click to toggle source
# File lib/def_dsl.rb, line 205
def so1(name)
  value = @so[name]
  value.is_a?(Array) ? value.last : value
end
so2(name) click to toggle source
# File lib/def_dsl.rb, line 209
def so2(name)
  return [] unless @so.key? name
  value = @so[name]
  value.is_a?(Array) ? value : [value]
end