class Lolita::Builder::Custom

Attributes

build_attributes[RW]
options[RW]

Public Class Methods

create(element, *args) click to toggle source
# File lib/lolita/builder.rb, line 30
def create(element, *args)
  possible_builder = extract_args(*args)
  if possible_builder.is_a?(Hash)
    Lolita::Builder::Custom.new(element, possible_builder)
  else
    possible_builder
  end
end
extract_args(*args) click to toggle source
# File lib/lolita/builder.rb, line 39
def extract_args(*args)
  if args && args.any?
    options = args.extract_options! || {}
    if args[0] && args[0].is_a?(self)
      args[0]
    elsif args[0].is_a?(String) || args[0].is_a?(Symbol)
      options[:name] = args[0]
      if args[1]
        options[:state] = args[1]
      end
      options
    elsif options
      options
    else
       raise ArgumentError, "Don't know how to make builder from #{options}."
    end
  else
    return {}
  end
end
new(element, attributes_as_hash) click to toggle source
# File lib/lolita/builder.rb, line 63
def initialize(element, attributes_as_hash)
  @element = element
  @options = {}
  @build_attributes = {}
  @conditions = {}
  set_attributes(attributes_as_hash)
  set_default_attribute_values
end

Public Instance Methods

build() click to toggle source
# File lib/lolita/builder.rb, line 82
def build
    
  path = if conditions?
    switch_path do |name,state|
      if conditions_met?
        [fixed_name(name).to_sym,state.to_sym]
      else
        [self.name, self.state]
      end
    end
  else
    [self.name,self.state]
  end
  result = path + [merged_options]
  return result
end
name() click to toggle source
# File lib/lolita/builder.rb, line 99
def name
  result = if build_attributes[:name].to_s.size > 0
    fixed_name(build_attributes[:name])
  else
    fixed_name(@name,build_attributes[:name])
  end
  result.to_sym
end
state() click to toggle source
# File lib/lolita/builder.rb, line 108
def state
  result = if build_attributes[:state] && build_attributes[:state].to_s.size > 0
    build_attributes[:state]
  else
    @state
  end
  result.to_sym
end
with(*values) click to toggle source
# File lib/lolita/builder.rb, line 72
def with(*values)
  new_values = self.class.extract_args(*values)
  if new_values.is_a?(Hash)
    @build_attributes = new_values
  else
    raise ArgumentError, "Can't build with other builder, use build on that builder!"
  end
  self
end

Private Instance Methods

attributes() click to toggle source
# File lib/lolita/builder.rb, line 169
def attributes
  [:name,:state]
end
compare(pattern,predicate) click to toggle source
# File lib/lolita/builder.rb, line 145
def compare(pattern,predicate)
  result = pattern.has_key?(:name) ? true : pattern[:name].to_s == build_attributes[:name].to_s
  pattern.each do |key,value|
    result &&= ((value.to_sym == self.send(key)) == predicate)
  end
  result
end
conditions() click to toggle source
# File lib/lolita/builder.rb, line 173
def conditions
  [:if,:unless]
end
conditions?() click to toggle source
# File lib/lolita/builder.rb, line 130
def conditions?
  @conditions.any?
end
conditions_met?() click to toggle source
# File lib/lolita/builder.rb, line 134
def conditions_met?
  @conditions_met = if conditions?
    if @conditions[:if]
      compare(@conditions[:if],true)
    elsif @conditions[:unless]
      compare(@conditions[:unless],false)
    end
  end
  @conditions_met
end
default_name() click to toggle source
# File lib/lolita/builder.rb, line 161
def default_name
  @element.builder_default_name
end
default_state() click to toggle source
# File lib/lolita/builder.rb, line 165
def default_state
  @element.builder_default_state
end
fixed_name(name_to_fix, first_part = nil) click to toggle source
# File lib/lolita/builder.rb, line 153
def fixed_name(name_to_fix, first_part = nil)
  unless name_to_fix.to_s[0] == "/"
    "/#{first_part.to_s.size > 0 ? first_part : default_name}/#{name_to_fix}".gsub(/\/{2,}/,"/").gsub(/\/$/,"")
  else
    name_to_fix
  end
end
merged_options() click to toggle source
# File lib/lolita/builder.rb, line 177
def merged_options
  result = {}
  (@build_attributes || {}).merge(@options).each do |key,value|
    unless attributes.include?(key.to_sym)
      result[key.to_sym] = value
    end
  end
  result
end
set_attributes(attributes_as_hash) click to toggle source
# File lib/lolita/builder.rb, line 187
def set_attributes(attributes_as_hash)
  attributes_as_hash.each do |attr_name, value|
    if attributes.include?(attr_name.to_sym)
      instance_variable_set(:"@#{attr_name}",value)
    elsif conditions.include?(attr_name.to_sym)
      @conditions[attr_name.to_sym] = value
    else
      @options[attr_name.to_sym] = value
    end
  end
end
set_default_attribute_values() click to toggle source
# File lib/lolita/builder.rb, line 199
def set_default_attribute_values
  @state ||= default_state
end
switch_path() { |old_name,old_state| ... } click to toggle source
# File lib/lolita/builder.rb, line 119
def switch_path
  old_name = @name
  old_state = @state
  @name = nil
  @state = default_state
  result = yield old_name,old_state
  @name = old_name
  @state = old_state
  result 
end