cirandas.net

ref: master

app/presenters/presenter.rb


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
class Presenter
  # Define presenter base_class
  def self.base_class
  end

  # Define base type condition
  def self.available?(instance)
    false
  end

  def self.for(instance)
    return instance if instance.is_a?(Presenter) || !available?(instance)

    klass = subclasses.sort_by {|class_instance|
      class_instance.accepts?(instance) || 0
    }.last

    klass.accepts?(instance) ? klass.new(instance) : f
  end

  def initialize(instance)
    @instance = instance
  end

  # Allows to use the original instance reference.
  def encapsulated_instance
    @instance
  end

  def id
    @instance.id
  end

  def reload
    @instance.reload
    self
  end

  def kind_of?(klass)
    @instance.kind_of?(klass)
  end

  # This method must be overridden in subclasses.
  #
  # If the class accepts the instance, return a number that represents the
  # priority the class should be given to handle that instance. Higher numbers
  # mean higher priority.
  #
  # If the class does not accept the instance, return false.
  def self.accepts?(f)
    nil
  end

  # That makes the presenter to works like any other not encapsulated instance.
  def method_missing(m, *args)
    @instance.send(m, *args)
  end
end