Sha256: 92faf10578b4d63ef7d6ce1655d3adf7e10dbaa652e3920b4877dcba240b5362

Contents?: true

Size: 1.37 KB

Versions: 4

Compression:

Stored size: 1.37 KB

Contents

module DataMapper
  class Property
    class Discriminator < Class
      include PassThroughLoadDump

      default   lambda { |resource, property| resource.model }
      required  true

      # @api private
      def bind
        model.default_scope(repository_name).update(name => model.descendants)

        model.class_eval <<-RUBY, __FILE__, __LINE__ + 1
          extend Chainable

          extendable do
            def inherited(model)
              super  # setup self.descendants
              set_discriminator_scope_for(model)
            end

            def new(*args, &block)
              if args.size == 1 && args.first.kind_of?(Hash)
                discriminator = properties(repository_name).discriminator

                if discriminator_value = args.first[discriminator.name]
                  model = discriminator.typecast_to_primitive(discriminator_value)

                  if model.kind_of?(Model) && !model.equal?(self)
                    return model.new(*args, &block)
                  end
                end
              end

              super
            end

            private

            def set_discriminator_scope_for(model)
              model.default_scope(#{repository_name.inspect}).update(#{name.inspect} => model.descendants)
            end
          end
        RUBY
      end
    end # class Discriminator
  end # module Types
end # module DataMapper

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
dm-core-1.0.0 lib/dm-core/property/discriminator.rb
dm-core-1.0.0.rc3 lib/dm-core/property/discriminator.rb
dm-core-1.0.0.rc2 lib/dm-core/property/discriminator.rb
dm-core-1.0.0.rc1 lib/dm-core/property/discriminator.rb