class ViewModel::Registry

Constants

DEFERRED_NAME

Public Class Methods

new() click to toggle source
# File lib/view_model/registry.rb, line 14
def initialize
  @lock = Monitor.new
  @viewmodel_classes_by_name = {}
  @deferred_viewmodel_classes = []
end

Public Instance Methods

all() click to toggle source
# File lib/view_model/registry.rb, line 37
def all
  @lock.synchronize do
    resolve_deferred_classes
    @viewmodel_classes_by_name.values
  end
end
clear_removed_classes!() click to toggle source

For Rails hot code loading: ditch any classes that are not longer present at their constant

# File lib/view_model/registry.rb, line 64
def clear_removed_classes!
  @lock.synchronize do
    resolve_deferred_classes
    @viewmodel_classes_by_name.delete_if do |_name, klass|
      !Kernel.const_defined?(klass.name)
    end
  end
end
default_view_name(model_class_name) click to toggle source
# File lib/view_model/registry.rb, line 54
def default_view_name(model_class_name)
  model_class_name.gsub('::', '.')
end
for_view_name(name) click to toggle source
# File lib/view_model/registry.rb, line 20
def for_view_name(name)
  raise ViewModel::DeserializationError::InvalidSyntax.new('ViewModel name cannot be nil') if name.nil?

  @lock.synchronize do
    # Resolve names for any deferred viewmodel classes
    resolve_deferred_classes

    viewmodel_class = @viewmodel_classes_by_name[name]

    if viewmodel_class.nil? || !(viewmodel_class < ViewModel)
      raise ViewModel::DeserializationError::UnknownView.new(name)
    end

    viewmodel_class
  end
end
infer_model_class_name(view_name) click to toggle source
# File lib/view_model/registry.rb, line 58
def infer_model_class_name(view_name)
  view_name.gsub('.', '::')
end
register(viewmodel, as: DEFERRED_NAME) click to toggle source
# File lib/view_model/registry.rb, line 48
def register(viewmodel, as: DEFERRED_NAME)
  @lock.synchronize do
    @deferred_viewmodel_classes << [viewmodel, as]
  end
end
roots() click to toggle source
# File lib/view_model/registry.rb, line 44
def roots
  all.select { |c| c.root? }
end

Private Instance Methods

resolve_deferred_classes() click to toggle source
# File lib/view_model/registry.rb, line 75
def resolve_deferred_classes
  until @deferred_viewmodel_classes.empty?
    vm, view_name = @deferred_viewmodel_classes.pop

    if vm.should_register?
      view_name = vm.view_name if view_name == DEFERRED_NAME
      @viewmodel_classes_by_name[view_name] = vm
    end
  end
end