module Dockly::Util::DSL::ClassMethods

Public Instance Methods

[](sym) click to toggle source
# File lib/dockly/util/dsl.rb, line 121
def [](sym)
  instances[sym]
end
default_values() click to toggle source
# File lib/dockly/util/dsl.rb, line 81
def default_values
  @default_values ||= if self.superclass.respond_to?(:default_values)
    Marshal.load(Marshal.dump(self.superclass.default_values))
  else
    {}
  end
end
demodulize(path) click to toggle source
# File lib/dockly/util/dsl.rb, line 93
def demodulize(path)
  if i = path.rindex('::')
    path[(i+2)..-1]
  else
    path
  end
end
generate_unique_name() click to toggle source
# File lib/dockly/util/dsl.rb, line 112
def generate_unique_name
  name = nil
  (0..(1.0 / 0.0)).each do |n|
    name = :"#{demodulize(self.name)}_#{n}"
    break unless instances.has_key?(name)
  end
  name
end
instances() click to toggle source
# File lib/dockly/util/dsl.rb, line 89
def instances
  @instances ||= {}
end
new!(options = {}, &block) click to toggle source
# File lib/dockly/util/dsl.rb, line 10
def new!(options = {}, &block)
  inst = new(options, &block)
  instances[inst.name] = inst
end
underscore(camel_cased_word) click to toggle source
# File lib/dockly/util/dsl.rb, line 101
def underscore(camel_cased_word)
  word = camel_cased_word.to_s.dup
  word.gsub!('::', '/')
  word.gsub!(/(?:([A-Za-z\d])|^)(#{/(?=a)b/})(?=\b|[^a-z])/) { "#{$1}#{$1 && '_'}#{$2.downcase}" }
  word.gsub!(/([A-Z\d]+)([A-Z][a-z])/,'\1_\2')
  word.gsub!(/([a-z\d])([A-Z])/,'\1_\2')
  word.tr!("-", "_")
  word.downcase!
  word
end

Private Instance Methods

default_value(name, val = nil) { |: val| ... } click to toggle source
# File lib/dockly/util/dsl.rb, line 76
def default_value(name, val = nil)
  default_values[name] = block_given? ? yield : val
end
define_forward_relation(name, related_name, current_class, klass, type) click to toggle source
# File lib/dockly/util/dsl.rb, line 41
def define_forward_relation(name, related_name, current_class, klass, type)
  current_class.instance_eval do
    define_method(name) do |sym = nil, &block|
      new_value = case
                  when !block.nil? && !sym.nil? then klass.new!(:name => sym, &block)
                  when block.nil?               then klass.instances[sym]
                  when sym.nil?                 then klass.new!(:name => :"#{self.name}_#{klass}", &block)
                  end
      unless new_value.nil?
        if type.ancestors.include? Array
          val = instance_variable_get(:"@#{name}") || []
          instance_variable_set(:"@#{name}", val + [new_value])
        else
          instance_variable_set(:"@#{name}", new_value)
        end
        new_value.instance_variable_set(
          :"@#{related_name}",
          self
        )
      end
      instance_variable_get(:"@#{name}")
    end
  end
end
define_reverse_relation(name, related_name, current_class, klass) click to toggle source
# File lib/dockly/util/dsl.rb, line 67
def define_reverse_relation(name, related_name, current_class, klass)
  current_class.instance_eval do
    define_method(name) do
      instance_variable_get(:"@#{name}")
    end
  end
end
dsl_attribute(*names) click to toggle source
# File lib/dockly/util/dsl.rb, line 15
def dsl_attribute(*names)
  names.each do |name|
    define_method(name) do |val = nil, &block|
      val_or_block = val.nil? ? block : val
      if val_or_block.nil?
        instance_variable_get(:"@#{name}")
      else
        instance_variable_set(:"@#{name}", val_or_block)
      end
    end
  end
end
dsl_class_attribute(name, klass, options={}) click to toggle source
# File lib/dockly/util/dsl.rb, line 29
def dsl_class_attribute(name, klass, options={})
  unless klass.ancestors.include?(Dockly::Util::DSL)
    raise "#{self}.dsl_class_attribute requires a class that includes DSL"
  end
  type = options.delete(:type) || Object
  generated_related_name = :"#{self.underscore(self.demodulize(self.to_s))}"
  related_name = options.delete(:related_name) || generated_related_name
  define_forward_relation(name, related_name, self, klass, type)
  define_reverse_relation(related_name, name, klass, self)
end