Sha256: a1b7fd751d38ecacf3a87ec22f73b4907a936163769af4219e1831eab2097220

Contents?: true

Size: 1.14 KB

Versions: 1

Compression:

Stored size: 1.14 KB

Contents

require 'singleton'
require 'active_decorator/helpers'

module ActiveDecorator
  class Decorator
    include Singleton

    def initialize
      @@decorators = {}
    end

    def decorate_if_model(obj)
      case obj
      when ActiveRecord::Base
        decorate obj
      when ActiveRecord::Relation
        class << obj
          def to_a_with_decorator
            arr = to_a_without_decorator
            arr.each do |model|
              ActiveDecorator::Decorator.instance.decorate model
            end
          end
          alias_method_chain :to_a, :decorator
        end
      when Array
        obj.each do |r|
          decorate_if_model r
        end
      end
    end

    def decorate(model)
      d = decorator_for model.class
      return model unless d
      model.extend d unless model.is_a? d
    end

    private
    def decorator_for(model_class)
      return @@decorators[model_class] if @@decorators.has_key? model_class

      decorator_name = "#{model_class.name}Decorator"
      d = decorator_name.constantize
      d.send :include, ActiveDecorator::Helpers
      @@decorators[model_class] = d
      rescue NameError
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
active_decorator-0.1.0 lib/active_decorator/decorator.rb