module Diecut::Configurable::ClassMethods

Attributes

target_name[RW]

Public Instance Methods

absorb_context(from) click to toggle source
# File lib/diecut/configurable.rb, line 38
def absorb_context(from)
  from.field_names.each do |name|
    from_metadata = from.field_metadata(name)
    from_value = from_metadata.default_value
    into_metadata = field_metadata(name)

    if into_metadata.nil?
      if from_value.is_a?(Class) and from_value < Calibrate::Configurable
        nested = build_subclass("#{target_name}.#{name}")
        setting(name, nested)
        nested.absorb_context(from_value)
      else
        if from_metadata.is?(:required)
          setting(name)
        else
          setting(name, from_value)
        end
      end
      next
    end
    into_value = into_metadata.default_value
    if into_value.is_a?(Class) and into_value < Calibrate::Configurable
      if from_value.is_a?(Class) and from_value < Calibrate::Configurable
        into_value.absorb_context(from_value)
      else
        raise FieldClash, "#{name.inspect} is already a complex value, but a simple value in the absorbed configurable"
      end
    else
      unless from_value.is_a?(Class) and from_value < Calibrate::Configurable
        # Noop - maybe should compare the default values? - should always
        # be nil right now...
      else
        raise FieldClash, "#{name.inspect} is already a simple value, but a complex value on the absorbed configurable"
      end
    end
  end
end
build_setting(field, is_section = false) click to toggle source
# File lib/diecut/configurable.rb, line 87
def build_setting(field, is_section = false)
  nested = walk_path(field).last.klass

  if is_section
    nested.setting(field.last, build_subclass("#{target_name}.#{field.last}"))
  else
    nested.setting(field.last)
  end
end
build_subclass(name) click to toggle source
# File lib/diecut/configurable.rb, line 10
def build_subclass(name)
  Class.new(self).tap{|cc| cc.target_name = name }
end
classname() click to toggle source
# File lib/diecut/configurable.rb, line 14
def classname
  name || superclass.name
end
deep_field_names() click to toggle source
# File lib/diecut/configurable.rb, line 18
def deep_field_names
  field_names.map do |name|
    field_value = field_metadata(name).default_value
    if field_value==self
      return ["LOOPED"]
    end
    if field_value.is_a?(Class) and field_value < Diecut::Configurable
      field_value.deep_field_names.map do |subname|
        "#{name}.#{subname}"
      end
    else
      name
    end
  end.flatten
end
inspect() click to toggle source
# File lib/diecut/configurable.rb, line 34
def inspect
  return "#<#{classname}:#{target_name}:(#{deep_field_names.join(",")})>"
end
walk_path(field_path) click to toggle source
# File lib/diecut/configurable.rb, line 76
def walk_path(field_path)
  first, *rest = *field_path

  segment = PathSegment.new(self, first.to_sym)
  if rest.empty?
    [segment]
  else
    [segment] + segment.nested.walk_path(rest)
  end
end