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