Sha256: 25c45c656511ebf12ca9a64fa837d70974977cb6b8fc4e023eac9b9c01d21bcb

Contents?: true

Size: 1.72 KB

Versions: 1

Compression:

Stored size: 1.72 KB

Contents

# encoding: utf-8

require 'rom/schema/definition/relation/base'

module ROM
  class Schema

    # Builder object used by schema DSL to establish Axiom relations
    #
    # @private
    class Definition
      include Equalizer.new(:repositories, :relations)

      attr_reader :repositories, :relations

      # @api private
      def initialize(repositories, &block)
        @repositories = repositories
        @relations    = {}
        instance_eval(&block) if block
      end

      # Build a base relation
      #
      # @example
      #
      #   Schema.build do
      #     base_relation :users do
      #       # ...
      #     end
      #   end
      #
      # @return [Definition]
      #
      # @api private
      def base_relation(name, &block)
        builder    = Relation::Base.new(relations, &block)
        repository = repositories.fetch(builder.repository)

        repository[name] = builder.call(name)
        relations[name]  = repository[name]
      end

      # Build a relation
      #
      # @example
      #
      #   Schema.build do
      #     relation :users do
      #       # ...
      #     end
      #   end
      #
      # @return [Definition]
      #
      # @api private
      def relation(name, &block)
        relations[name] = instance_eval(&block)
      end

      # Return relation identified by name
      #
      # @return [Axiom::Relation, Axiom::Relation::Base]
      #
      # @api private
      def [](name)
        relations[name]
      end

      private

      # Method missing hook
      #
      # @return [Axiom::Relation, Axiom::Relation::Base]
      #
      # @api private
      def method_missing(*args)
        self[args.first] || super
      end

    end # Definition

  end # Schema
end # ROM

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
rom-0.2.0 lib/rom/schema/definition.rb