locomotivecms/steam

View on GitHub
lib/locomotive/steam/models/associations/referenced.rb

Summary

Maintainability
A
35 mins
Test Coverage
module Locomotive::Steam
  module Models

    class ReferencedAssociation

      attr_reader :repository

      def initialize(repository_klass, scope, adapter, options = {}, &block)
        # build a new instance of the target repository
        @repository = repository_klass.new(adapter)

        # Note: if we change the locale of the parent repository, that won't
        # reflect in that repository
        @repository.scope = scope.dup

        # the block will executed when a method of the target will be called
        @block = block_given? ? block : nil

        @options = options
      end

      def __name__
        @options[:association_name]
      end

      def __attach__(entity)
        @entity = entity
      end

      def __load__
        # needs implementation
      end

      def __serialize__(entity)
        # needs implementation
      end

      def __call_block_once__
        # setup the repository if custom configuration from the
        # repository for instance.
        if @block
          @block.call(@repository, @options)
          @block = nil # trick to call it only once
        end
      end

      def method_missing(name, *args, &block)
        __call_block_once__

        __load__.try(:send, name, *args, &block)
      end

    end

  end
end