Sha256: 7812513f6ff63b70aa7eaab87b8d7f3ff29581b40b1fbe449eea173f056e4a13

Contents?: true

Size: 975 Bytes

Versions: 48

Compression:

Stored size: 975 Bytes

Contents

require 'ostruct'

class ThemePresentation
  def self.wrap(data, *presenters)
    normalized = normalize(data)
    presenters = normalize_presenters(presenters)

    wrapped_data = presenters.inject(normalized) do |wrapped, presenter|
      presenter.new(wrapped)
    end

    class << wrapped_data
      attr_accessor :wrapped_by
    end

    wrapped_data.wrapped_by = presenters

    wrapped_data
  end

  def self.wrap_collection(collection, *presenters)
    collection.collect { |item| wrap(item, *presenters) }
  end

  private

  def self.normalize(data)
    if data.is_a? Hash
      OpenStruct.new(data)
    else
      data
    end
  end

  def self.normalize_presenters(presenters)
    presenters.reject!(&:nil?)
    add_class_delegation(presenters)

    presenters
  end

  def self.add_class_delegation(presenters)
    presenters.each do |presenter|
      presenter.class_eval do
        def class
          __getobj__.class
        end
      end
    end
  end
end

Version data entries

48 entries across 48 versions & 1 rubygems

Version Path
woople-theme-0.2.41 app/presenters/theme_presentation.rb
woople-theme-0.2.40 app/presenters/theme_presentation.rb
woople-theme-0.2.39 app/presenters/theme_presentation.rb
woople-theme-0.2.38 app/presenters/theme_presentation.rb
woople-theme-0.2.37 app/presenters/theme_presentation.rb
woople-theme-0.2.36 app/presenters/theme_presentation.rb
woople-theme-0.2.35 app/presenters/theme_presentation.rb
woople-theme-0.2.34 app/presenters/theme_presentation.rb
woople-theme-0.2.33 app/presenters/theme_presentation.rb
woople-theme-0.2.32 app/presenters/theme_presentation.rb
woople-theme-0.2.31 app/presenters/theme_presentation.rb
woople-theme-0.2.30 app/presenters/theme_presentation.rb
woople-theme-0.2.29 app/presenters/theme_presentation.rb
woople-theme-0.2.28 app/presenters/theme_presentation.rb
woople-theme-0.2.27 app/presenters/theme_presentation.rb
woople-theme-0.2.26 app/presenters/theme_presentation.rb
woople-theme-0.2.25 app/presenters/theme_presentation.rb
woople-theme-0.2.24 app/presenters/theme_presentation.rb
woople-theme-0.2.23 app/presenters/theme_presentation.rb
woople-theme-0.2.22 app/presenters/theme_presentation.rb