Class: Magic::Presenter::Base

Inherits:
Decorator::Base
  • Object
show all
Includes:
GlobalID, Helpers
Defined in:
lib/magic/presenter/base.rb

Overview

Magic Presenter

Any presenter should inherit Magic::Presenter::Base. It further inherits from SimpleDelegator and behaves like that.

Presenter class inference

Presenters provide automatic class inference for any model based on its class name powered by Magic Lookup. For example, MyModel.new looks for MyPresenter first. If not found, it looks for presenters of its ancestor classes, up to ObjectPresenter.

Class Method Summary collapse

Dynamic Method Handling

This class handles dynamic methods through the method_missing method in the class Magic::Presenter::Helpers

Class Method Details

.descendantsObject



50
51
52
53
54
# File 'lib/magic/presenter/base.rb', line 50

def descendants
	Magic.eager_load :presenters

	super
end

.model_classObject



30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
# File 'lib/magic/presenter/base.rb', line 30

def model_class
	Presentable.classes
			.select { self.for(_1) == self }
			.optional do |classes|
				next unless classes.many?

				classes
						.select { name_for(_1) == name }
						.optional { classes if _1.empty? } # lookup failed — return original
			end
			.sole
rescue Enumerable::SoleItemExpectedError => error
	raise Lookup::Error, "#{error.message
			.sub('items', 'model classes')
			.sub('item',  'model class')
	} for #{self}"
end

.name_for(object_class) ⇒ Object



22
23
24
25
26
27
28
# File 'lib/magic/presenter/base.rb', line 22

def name_for object_class
	object_class
			.to_s
			.delete_suffix('Model')
			.delete_suffix('Record')
			.then { "#{_1}Presenter" }
end