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