class Xenon::Headers

Public Class Methods

Header(name) click to toggle source
# File lib/xenon/headers.rb, line 67
def Header(name)
  klass = Class.new do
    def name
      self.class.const_get(:NAME)
    end

    def self.inherited(base)
      Headers.register(base)
    end
  end
  Headers.const_set("#{name.tr('-', '_').classify}Header", klass)
  klass.const_set(:NAME, name)
  klass
end
ListHeader(name) click to toggle source
# File lib/xenon/headers.rb, line 82
def ListHeader(name)
  klass = Header(name)
  klass.class_eval do
    attr_reader :values

    def initialize(values)
      @values = values
    end

    def merge(other)
      self.class.new(*(@values + other.values))
    end

    def to_s
      @values.map(&:to_s).join(', ')
    end
  end
  klass
end
header_class(name) click to toggle source
# File lib/xenon/headers.rb, line 63
def header_class(name)
  (@registered || {})[name]
end
inherited(base) click to toggle source
# File lib/xenon/headers.rb, line 73
def self.inherited(base)
  Headers.register(base)
end
initialize(values) click to toggle source
# File lib/xenon/headers.rb, line 87
def initialize(values)
  @values = values
end
merge(other) click to toggle source
# File lib/xenon/headers.rb, line 91
def merge(other)
  self.class.new(*(@values + other.values))
end
name() click to toggle source
# File lib/xenon/headers.rb, line 69
def name
  self.class.const_get(:NAME)
end
new() click to toggle source
# File lib/xenon/headers.rb, line 7
def initialize
  @hash = {}
end
register(klass) click to toggle source
# File lib/xenon/headers.rb, line 59
def register(klass)
  (@registered ||= {})[klass.const_get(:NAME)] = klass
end
to_s() click to toggle source
# File lib/xenon/headers.rb, line 95
def to_s
  @values.map(&:to_s).join(', ')
end

Public Instance Methods

<<(header)
Alias for: add!
add!(header) click to toggle source
# File lib/xenon/headers.rb, line 30
def add!(header)
  existing = @hash[header.name]
  if existing
    if existing.respond_to?(:merge)
      set!(existing.merge(header))
    else
      raise "Unmergeable header '#{header.name}' already exists"
    end
  else
    set!(header)
  end
  self
end
Also aliased as: <<
each(&block) click to toggle source
# File lib/xenon/headers.rb, line 21
def each(&block)
  @hash.values.each(&block)
end
freeze() click to toggle source
Calls superclass method
# File lib/xenon/headers.rb, line 16
def freeze
  @hash.freeze
  super
end
initialize_dup(other) click to toggle source
Calls superclass method
# File lib/xenon/headers.rb, line 11
def initialize_dup(other)
  super
  @hash = @hash.dup
end
remove!(header) click to toggle source
# File lib/xenon/headers.rb, line 44
def remove!(header)
  header = header.name if header.respond_to?(:name)
  @hash.delete(header)
  self
end
set!(header) click to toggle source
# File lib/xenon/headers.rb, line 25
def set!(header)
  @hash[header.name] = header
  self
end