Sha256: 72b1994f22ab8f7416ed5650d77e4dc1bf56c1314db494169b606b61aa355444

Contents?: true

Size: 1.94 KB

Versions: 2

Compression:

Stored size: 1.94 KB

Contents

module Tokamak
  module Builder
    class Base

      @@global_media_types = {}

      class << self
        def builder_for(*args)
          # class instance variable to store media types handled by a builder
          @media_types ||= []
          args.each do |media_type|
            @media_types << media_type
            @@global_media_types[media_type] = self
          end
        end
        
        alias_method :add_media_type, :builder_for
        
        def media_types
          @media_types
        end

        def global_media_types
          @@global_media_types
        end

        def build(obj, options = {}, &block)
          recipe = block_given? ? block : options.delete(:recipe)

          unless recipe.respond_to?(:call)
            recipe = Tokamak::Recipes[recipe]
            raise Tokamak::BuilderError.new("Recipe required to build representation.") unless recipe.respond_to?(:call)
          end

          builder = self.new(obj, options)

          recipe.call(*[builder, obj, options][0, recipe.arity])

          builder.representation
        end

        def helper
          @helper_module ||= Tokamak::Builder.helper_module_for(self)
        end

        def collection_helper_default_options(options = {}, &block)
          generic_helper(:collection, options, &block)
        end

        def member_helper_default_options(type, options = {}, &block)
          generic_helper(:member, options, &block)
        end

        def generic_helper(section, options = {}, &block)
          helper.send(:remove_method, section)
          var_name = "@@more_options_#{section.to_s}".to_sym
          helper.send(:class_variable_set, var_name, options)
          helper.module_eval <<-EOS
            def #{section.to_s}(obj, *args, &block)
              #{var_name}.merge!(args.shift)
              args.unshift(#{var_name})
              #{self.name}.build(obj, *args, &block)
            end
          EOS
        end
      end

    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
tokamak-1.2.1 lib/tokamak/builder/base.rb
tokamak-1.2.0 lib/tokamak/builder/base.rb