class Olfactory::TemplateDefinition

Attributes

t_afters[RW]
t_befores[RW]
t_dictionaries[RW]
t_instantiators[RW]
t_items[RW]
t_macros[RW]
t_presets[RW]
t_sequences[RW]
t_subtemplates[RW]

Public Class Methods

new() click to toggle source
# File lib/olfactory/template_definition.rb, line 5
def initialize
  self.t_items = {}
  self.t_subtemplates = {}
  self.t_sequences = {}
  self.t_dictionaries = {}
  self.t_macros = {}
  self.t_presets = {}
  self.t_befores = {}
  self.t_afters = {}
  self.t_instantiators = {}
end

Public Instance Methods

after(context = nil, options = {}, &block) click to toggle source
# File lib/olfactory/template_definition.rb, line 183
def after(context = nil, options = {}, &block)
  if context.class == Hash
    # Arguments need to be remapped...
    options = context
    context = nil
  end
  after_definition = { :type => :default,
                        :evaluator => block
                      }.merge(options)
  after_definition.merge!(:preset => options[:preset]) if options[:preset]
  context ||= :all
  self.t_afters[context] ||= []
  self.t_afters[context] << after_definition
end
before(context = nil, options = {}, &block) click to toggle source

Defines defaults

# File lib/olfactory/template_definition.rb, line 169
def before(context = nil, options = {}, &block)
  if context.class == Hash
    # Arguments need to be remapped...
    options = context
    context = nil
  end
  before_definition = { :type => :default,
                        :evaluator => block
                      }.merge(options)
  before_definition.merge!(:preset => options[:preset]) if options[:preset]
  context ||= :all
  self.t_befores[context] ||= []
  self.t_befores[context] << before_definition
end
construct(block, options = {}) click to toggle source
# File lib/olfactory/template_definition.rb, line 17
def construct(block, options = {})
  if options[:preset] || options[:quantity]
    self.construct_preset(options[:preset], (options[:quantity] || 1), options.reject { |k,v| [:preset, :quantity].include?(k) })
  else
    new_template = Template.new(self, options)
    new_template.construct(block, options)
  end
  new_template
end
construct_preset(preset_name, quantity, options = {}) click to toggle source
# File lib/olfactory/template_definition.rb, line 26
def construct_preset(preset_name, quantity, options = {})
  raise "Quantity must be an integer!" if !(quantity.class <= Integer)

  if quantity > 1
    # Build multiple
    if preset_name
      Array.new(quantity) { self.construct_preset(preset_name, 1, options) }
    else
      Array.new(quantity) { self.construct(nil, options) }
    end
  elsif quantity == 1
    if preset_definition = self.find_preset_definition(preset_name)
      # Build single
      new_template = Template.new(self, options)
      preset_block = preset_definition[:evaluator]
      if preset_definition[:regexp]
        new_template.construct(preset_block, options.merge(:value => preset_name))
      else
        new_template.construct(preset_block, options)
      end
    elsif preset_name.nil?
      self.construct(nil, options)
    else
      raise "Missing preset matching '#{preset_name}' for template!"
    end
  else quantity <= 0
    raise "Can't build 0 or less items!"
  end
end
dictionary(name, options = {}) click to toggle source

Defines a dictionary

# File lib/olfactory/template_definition.rb, line 139
def dictionary(name, options = {})
  self.t_dictionaries[name] = Olfactory::Dictionary.new(name, { :scope => :instance }.merge(options))
end
embeds_many(name, options = {}, &block) click to toggle source
# File lib/olfactory/template_definition.rb, line 129
def embeds_many(name, options = {}, &block)
  self.embeds_one(name, options.merge(:collection => (options[:named] ? Hash : Array)), &block)
end
embeds_one(name, options = {}, &block) click to toggle source

Defines a hash-holding field

# File lib/olfactory/template_definition.rb, line 123
def embeds_one(name, options = {}, &block)
  self.t_subtemplates[name] = { :type => :subtemplate,
                                :name => name,
                                :evaluator => block 
                              }.merge(options)
end
find_definition_in_list(name, definition_list) click to toggle source
# File lib/olfactory/template_definition.rb, line 64
def find_definition_in_list(name, definition_list)
  definition = definition_list[name]
  definition ||= definition_list.values.detect do |v|
    v.has_key?(:alias) && (v[:alias] == name || (v.respond_to?("include") && v.include?(name)))
  end
  definition
end
find_dictionary_definition(name) click to toggle source
# File lib/olfactory/template_definition.rb, line 88
def find_dictionary_definition(name)
  self.t_dictionaries[name]
end
find_field_definition(name) click to toggle source
# File lib/olfactory/template_definition.rb, line 56
def find_field_definition(name)
  definition = find_macro_definition(name)
  definition ||= find_subtemplate_definition(name)
  definition ||= find_item_definition(name)
  definition ||= find_dictionary_definition(name)
  definition
end
find_item_definition(name) click to toggle source
# File lib/olfactory/template_definition.rb, line 82
def find_item_definition(name)
  definition = self.find_definition_in_list(name, self.t_items)
  definition ||= self.t_items.values.detect { |v| v.has_key?(:singular) && v[:singular] == name }
  definition
end
find_macro_definition(name) click to toggle source
# File lib/olfactory/template_definition.rb, line 72
def find_macro_definition(name)
  self.find_definition_in_list(name, self.t_macros)
end
find_preset_definition(name) click to toggle source
# File lib/olfactory/template_definition.rb, line 92
def find_preset_definition(name)
  preset_definition = self.find_definition_in_list(name, self.t_presets)
  if preset_definition.nil?
    # Try to find a regexp named preset that matches
    name = self.t_presets.keys.detect { |p_name| p_name.class == Regexp && p_name.match(name.to_s) }
    preset_definition = self.t_presets[name] if name
  end
  preset_definition
end
find_subtemplate_definition(name) click to toggle source
# File lib/olfactory/template_definition.rb, line 76
def find_subtemplate_definition(name)
  definition = self.find_definition_in_list(name, self.t_subtemplates)
  definition ||= self.t_subtemplates.values.detect { |v| v.has_key?(:singular) && v[:singular] == name }
  definition
end
has_many(name, options = {}, &block) click to toggle source
# File lib/olfactory/template_definition.rb, line 118
def has_many(name, options = {}, &block)
  self.has_one(name, options.merge(:collection => (options[:named] ? Hash : Array)), &block)
end
has_one(name, options = {}, &block) click to toggle source

Defines a value holding field

# File lib/olfactory/template_definition.rb, line 112
def has_one(name, options = {}, &block)
  self.t_items[name] = {  :type => :item,
                          :name => name,
                          :evaluator => block
                        }.merge(options)
end
instantiate(name, options = {}, &block) click to toggle source

Defines an instantiator

# File lib/olfactory/template_definition.rb, line 161
def instantiate(name, options = {}, &block)
  self.t_instantiators[name] = {  :type => :instantiator,
                                  :name => name,
                                  :evaluator => block 
                                }.merge(options)
end
macro(name, options = {}, &block) click to toggle source

Defines a macro

# File lib/olfactory/template_definition.rb, line 144
def macro(name, options = {}, &block)
  self.t_macros[name] = { :type => :macro,
                          :name => name,
                          :evaluator => block 
                        }.merge(options)
end
preset(name, options = {}, &block) click to toggle source

Defines a preset of values

# File lib/olfactory/template_definition.rb, line 152
def preset(name, options = {}, &block)
  self.t_presets[name] = {  :type => :preset,
                            :name => name,
                            :evaluator => block
                          }.merge(options)
  self.t_presets[name] = self.t_presets[name].merge(:regexp => name) if name.class <= Regexp
end
reset_dictionaries(*names) click to toggle source
# File lib/olfactory/template_definition.rb, line 106
def reset_dictionaries(*names)
  names = self.t_dictionaries.keys if names.empty?
  names.each { |name| self.t_dictionaries[name].reset }
end
reset_sequences(*names) click to toggle source
# File lib/olfactory/template_definition.rb, line 102
def reset_sequences(*names)
  names = self.t_sequences.keys if names.empty?
  names.each { |name| self.t_sequences[name].reset }
end
sequence(name, options = {}, &block) click to toggle source

Defines a sequence

# File lib/olfactory/template_definition.rb, line 134
def sequence(name, options = {}, &block)
  self.t_sequences[name] = Olfactory::Sequence.new(name, { :scope => :instance }.merge(options), block)
end