Sha256: c84137f5e0949c795c94c28dd10ee5f29bcd9a28cb4f81545f721d3234a1f092

Contents?: true

Size: 1.69 KB

Versions: 8

Compression:

Stored size: 1.69 KB

Contents

module DataMapper
  module Resource
    class State

      # a not-persisted/modifiable resource
      class Transient < State
        def get(subject, *args)
          set_default_value(subject)
          super
        end

        def set(subject, value)
          track(subject)
          super
        end

        def delete
          self
        end

        def commit
          set_child_keys
          set_default_values
          return self unless valid_attributes?
          create_resource
          set_repository
          add_to_identity_map
          Clean.new(resource)
        end

        def rollback
          self
        end

        def original_attributes
          @original_attributes ||= {}
        end

      private

        def repository
          @repository ||= model.repository
        end

        def set_default_values
          (properties | relationships).each do |subject|
            set_default_value(subject)
          end
        end

        def set_default_value(subject)
          return if subject.loaded?(resource) || !subject.default?
          set(subject, subject.default_for(resource))
        end

        def track(subject)
          original_attributes[subject] = nil
        end

        def create_resource
          repository.create([ resource ])
        end

        def set_repository
          resource.instance_variable_set(:@_repository, repository)
        end

        def valid_attributes?
          properties.all? do |property|
            value = get(property)
            property.serial? && value.nil? || property.valid?(value)
          end
        end

      end # class Transient
    end # class State
  end # module Resource
end # module DataMapper

Version data entries

8 entries across 8 versions & 1 rubygems

Version Path
dm-core-1.1.0 lib/dm-core/resource/state/transient.rb
dm-core-1.1.0.rc3 lib/dm-core/resource/state/transient.rb
dm-core-1.1.0.rc2 lib/dm-core/resource/state/transient.rb
dm-core-1.1.0.rc1 lib/dm-core/resource/state/transient.rb
dm-core-1.0.2 lib/dm-core/resource/state/transient.rb
dm-core-1.0.1 lib/dm-core/resource/state/transient.rb
dm-core-1.0.0 lib/dm-core/resource/state/transient.rb
dm-core-1.0.0.rc3 lib/dm-core/resource/state/transient.rb