Class: ViewModel::Registry

Inherits:
Object
  • Object
show all
Includes:
Singleton
Defined in:
lib/view_model/registry.rb

Constant Summary collapse

DEFERRED_NAME =
Object.new

Instance Method Summary collapse

Constructor Details

#initializeRegistry

Returns a new instance of Registry.



13
14
15
16
17
# File 'lib/view_model/registry.rb', line 13

def initialize
  @lock = Monitor.new
  @viewmodel_classes_by_name  = {}
  @deferred_viewmodel_classes = []
end

Instance Method Details

#clear_removed_classes!Object

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



52
53
54
55
56
57
58
59
# File 'lib/view_model/registry.rb', line 52

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) ⇒ Object



42
43
44
# File 'lib/view_model/registry.rb', line 42

def default_view_name(model_class_name)
  model_class_name.gsub('::', '.')
end

#for_view_name(name) ⇒ Object



19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# File 'lib/view_model/registry.rb', line 19

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) ⇒ Object



46
47
48
# File 'lib/view_model/registry.rb', line 46

def infer_model_class_name(view_name)
  view_name.gsub('.', '::')
end

#register(viewmodel, as: DEFERRED_NAME) ⇒ Object



36
37
38
39
40
# File 'lib/view_model/registry.rb', line 36

def register(viewmodel, as: DEFERRED_NAME)
  @lock.synchronize do
    @deferred_viewmodel_classes << [viewmodel, as]
  end
end