module Resubject::Builder

Public Class Methods

present(objects, template, *presenters) click to toggle source

Presents a object or a collection of objects

@param [Object, Array<Object>] objects objects to be instantiated with related presenter @param template then HTML template context @param [Presenter] presenters one or multiple presenters

@return [Presenter, Array<Presenter>] either the presenter or a collection of presenter

@example

Builder.present box, template
# => <BoxPresenter>

# Using a custom presenter
Builder.present box, template, CustomPresenter
# => <CustomPresenter>

# Using multiple presenters
Builder.present box, template, OnePresenter, CustomPresenter
# => <OnePresenter<CustomPresenter>>

# Using a collection
Builder.present [box, box], template
# => [<BoxPresenter>, <BoxPresenter>]

@see .present_one @see .present_all

# File lib/resubject/builder.rb, line 35
def self.present(objects, template, *presenters)
  if objects.respond_to?(:each)
    Builder.present_all(objects, template, *presenters)
  else
    Builder.present_one(objects, template, *presenters)
  end
end
present_all(objects, template, *presenters) click to toggle source

Presents a collection of objects (see .present)

@param [Array<Object>] objects objects to be instantiated with related presenter @param template then HTML template context @param [Presenter] presenters one or multiple presenters

@return [Array<Presenter>] collection of instances of the related presenter

@example

Builder.present [box, box], template
# => [<BoxPresenter>, <BoxPresenter>]

@see .present @see .present_one

# File lib/resubject/builder.rb, line 96
def self.present_all(objects, template, *presenters)
  objects.map do |o|
    Builder.present_one(o, template, *presenters)
  end
end
present_one(object, template, *presenters) click to toggle source

Presents a single object (see .present)

@param [Object] object object to be instantiated with related presenter @param template then HTML template context @param [Presenter] presenters one or multiple presenters

@raise [InvalidPresenterArgument] if a presenter was not received in presenters param

@return [Presenter] either instance of the presenter related to the object

@example

Builder.present_one box, context                              # => <BoxPresenter>
Builder.present_one box, context, CustomPresenter             # => <CustomPresenter>
Builder.present_one box, context, OnePresenter, TwoPresenter  # => <TwoPresenter<OnePresenter>>

@example Skips nil classes

Builder.present_one nil
# => nil

@see .present

# File lib/resubject/builder.rb, line 66
def self.present_one(object, template, *presenters)
  return unless object

  presenters = [Naming.presenter_for(object)] unless presenters.any?

  unless presenters.all? { |p| p.is_a?(Class) && p.ancestors.include?(Resubject::Presenter) }
    raise InvalidPresenterArgument, "Expected a presenter in #{presenters.inspect}"
  end

  presenters.inject(object) do |presented, klass|
    klass.new(presented, template)
  end
end