1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133
|
adamantium
==========
Create immutable objects with ease.
[][gem]
[][travis]
[][gemnasium]
[][codeclimate]
[][coveralls]
[gem]: https://rubygems.org/gems/adamantium
[travis]: https://travis-ci.org/dkubb/adamantium
[gemnasium]: https://gemnasium.com/dkubb/adamantium
[codeclimate]: https://codeclimate.com/github/dkubb/adamantium
[coveralls]: https://coveralls.io/r/dkubb/adamantium
This is a small standalone gem featuring a module ripped out from [axiom](https://github.com/dkubb/axiom).
It allows you to make objects immutable in a simple, unobtrusive way.
Examples
--------
``` ruby
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
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
# 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
-------
* Dan Kubb ([dkubb](https://github.com/dkubb))
* Markus Schirp ([mbj](https://github.com/mbj))
Contributing
------------
See [CONTRIBUTING.md](CONTRIBUTING.md) for details.
Copyright
---------
Copyright © 2012-2013 Dan Kubb. See LICENSE for details.
|