class TimeScales::Frame::TypeBuilder

Attributes

parts[R]

Public Class Methods

new(parts) click to toggle source
# File lib/time_scales/frame/type_builder.rb, line 29
def initialize(parts)
  @parts = parts
end

Private Class Methods

add_type_cache() click to toggle source
# File lib/time_scales/frame/type_builder.rb, line 11
def add_type_cache
  # Closure variable accessible via instance method
  # from any instance.
  _type_cache = {}

  define_method(:type_cache){
    _type_cache
  }

  private :type_cache
end

Public Instance Methods

call() click to toggle source
# File lib/time_scales/frame/type_builder.rb, line 33
def call
  type_cache.fetch( parts ) {
    type_cache[parts] = build_type
  }
end

Private Instance Methods

build_type() click to toggle source
# File lib/time_scales/frame/type_builder.rb, line 41
def build_type
  _parts = parts ; _is_scheme_scoped = scheme_scoped?
  klass = Class.new type_base_class do
    _parts.each do |part| ; include part.component_mixin ; end
    include _parts.last.scheme_scoped_precision_mixin if _is_scheme_scoped
  end
  Frame.const_set type_const_name, klass
  klass
end
scheme_scoped?() click to toggle source
# File lib/time_scales/frame/type_builder.rb, line 59
def scheme_scoped?
  parts.first.scope == Units::Scheme
end
type_base_class() click to toggle source
# File lib/time_scales/frame/type_builder.rb, line 51
def type_base_class
  if scheme_scoped?
    Frame::SchemeRelativeFrame
  else
    Frame::Base
  end
end
type_const_name() click to toggle source
# File lib/time_scales/frame/type_builder.rb, line 63
def type_const_name
  const_name = "#{parts.first.name}"
  parts[1..-1].each do |part| ; const_name << "_#{part.subdivision_name}" ; end
  const_name << 'Only' if parts.length == 1
  const_name << '__Auto'
end