Sha256: 215f21fd944f83fbf954590317aae06c20b2150df16cac13dee299d2378c91df

Contents?: true

Size: 772 Bytes

Versions: 4

Compression:

Stored size: 772 Bytes

Contents

require 'forwardable'

module Hamster

  module Immutable

    def self.included(klass)
      klass.extend(ClassMethods)
      klass.instance_eval do
        include InstanceMethods
      end
    end

    module ClassMethods

      def new(*args)
        super.freeze
      end

    end

    module InstanceMethods

      extend Forwardable

      def immutable?
        frozen?
      end

      alias_method :__copy__, :dup
      private :__copy__

      def dup
        self
      end
      def_delegator :self, :dup, :clone

      protected

      def transform_unless(condition, &block)
        condition ? self : transform(&block)
      end

      def transform(&block)
        __copy__.tap { |copy| copy.instance_eval(&block) }.freeze
      end

    end

  end

end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
hamster-0.3.3 lib/hamster/immutable.rb
hamster-0.3.2 lib/hamster/immutable.rb
hamster-0.3.1 lib/hamster/immutable.rb
hamster-0.3.0 lib/hamster/immutable.rb