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