Sha256: f347477d48be82e961caac4b9d187f45cab08ff13291d46655f14f918ff341be

Contents?: true

Size: 1.49 KB

Versions: 3

Compression:

Stored size: 1.49 KB

Contents

module MongoMapper
  module Associations
    class Proxy
      attr_reader :owner, :association

      instance_methods.each do |m|
        undef_method m unless m =~ /(^__|^nil\?$|^send$|proxy_|^object_id$)/
      end

      def initialize(owner, association)
        @owner = owner
        @association = association
        reset
      end

      def respond_to?(*methods)
        (load_target && @target.respond_to?(*methods))
      end

      def reset
        @target = nil
      end

      def reload_target
        reset
        load_target
        self
      end

      def send(method, *args)
        load_target
        @target.send(method, *args)
      end

      def replace(v)
        raise NotImplementedError
      end

      protected
        def method_missing(method, *args)
          if load_target
            if block_given?
              @target.send(method, *args)  { |*block_args| yield(*block_args) }
            else
              @target.send(method, *args)
            end
          end
        end

        def load_target
          @target ||= find_target
        end

        def find_target
          raise NotImplementedError
        end
        
        # Array#flatten has problems with recursive arrays. Going one level
        # deeper solves the majority of the problems.
        def flatten_deeper(array)
          array.collect do |element|
            (element.respond_to?(:flatten) && !element.is_a?(Hash)) ? element.flatten : element
          end.flatten
        end
    end
  end
end

Version data entries

3 entries across 3 versions & 2 rubygems

Version Path
djsun-mongomapper-0.3.1.1 lib/mongomapper/associations/proxy.rb
djsun-mongomapper-0.3.1 lib/mongomapper/associations/proxy.rb
jnunemaker-mongomapper-0.3.2 lib/mongomapper/associations/proxy.rb