Project

adamantium

0.75
No commit activity in last 3 years
No release in over 3 years
There's a lot of open issues
Immutable extensions to objects
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
 Dependencies

Development

>= 1.5.2, ~> 1.5

Runtime

~> 0.11.0
~> 0.4.0
 Project Readme

adamantium

Create immutable objects with ease.

Gem Version Build Status Dependency Status Code Climate Coverage Status

This is a small standalone gem featuring a module extracted from axiom. It allows you to make objects immutable in a simple, unobtrusive way.

Examples

require 'adamantium'
require 'securerandom'

class Example
  # Inclusion of Adamantium defaults to deep freeze behavior
  # of constructor and memoizer

  include Adamantium

  # Instance and attributes (ivars) are frozen per default
  # Example:
  #
  # object = Example.new
  # object.frozen?           # => true
  # object.attribute.frozen? # => true
  #
  def initialize
    @attribute = "foo bar"
  end
  attr_reader :attribute

  # Memoized method with deeply frozen value (default)
  # Example:
  #
  # object = Example.new
  # object.random => ["abcdef"]
  # object.random => ["abcdef"]
  # object.random.frozen? => true
  # object.random[0].frozen? => true
  #
  def random
    [SecureRandom.hex(6)]
  end
  memoize :random

  # Memoized method with non frozen value
  # Example:
  #
  # object = Example.new
  # object.buffer         # => <StringIO:abcdef>
  # object.buffer         # => <StringIO:abcdef>
  # object.buffer.frozen? # => false
  #
  def buffer
    StringIO.new
  end
  memoize :buffer, freezer: :noop

  # Memoized method with shallow frozen value
  # Example:
  #
  # object = Example.new
  # object.random2 => ["abcdef"]
  # object.random2 => ["abcdef"]
  # object.random2.frozen? => true
  # object.random2[0].frozen? => false
  #
  def random2
    [SecureRandom.hex(6)]
  end
  memoize :random2, freezer: :flat

  # Transform method derives changed instances without
  # calling the constructor
  # Example:
  #
  # object = Example.new
  # object.random => ["abcdef"]
  # update = object.edit "baz quux"
  # update.random => ["abcdef"]
  # update.attribute => "baz quux"
  #
  def edit(attribute)
    transform do
      @attribute = attribute
    end
  end
end

class FlatExample
  # Inclusion of Adamantium::Flat defaults to shallow frozen
  # behavior for memoizer and constructor

  include Adamantium::Flat

  # Instance is frozen but attribute is not
  # Example:
  #
  # object = FlatExample.new
  # object.frozen?           # => true
  # object.attribute.frozen? # => false
  #
  def initialize
    @attribute = "foo bar"
  end
  attr_reader :attribute

  # Memoized method with flat frozen value (default with Adamantium::Flat)
  # Example:
  #
  # object = Example.new
  # object.random => ["abcdef"]
  # object.random => ["abcdef"]
  # object.random.frozen? => true
  # object.random[0].frozen? => false
  #
  def random
    [SecureRandom.hex(6)]
  end
  memoize :random
end

Credits

Contributing

See CONTRIBUTING.md for details.

Copyright

Copyright © 2012-2014 Dan Kubb. See LICENSE for details.