Project

memorium

0.0
The project is in a healthy, maintained state
Toolkit for creating convenient classes with lazy calculations.
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
 Dependencies

Development

~> 3.12

Runtime

 Project Readme

Memorium

Toolkit for creating convenient classes with lazy calculations. Provides method memoization, declarative attribute initialization, and attribute validation.

Installation

Add to your Gemfile:

gem "memorium"

Or install directly:

gem install memorium

Usage

Method Memoization (memo)

Cache the result of a method so it's computed only once:

class Calculator
  memo def heavy_computation
    sleep 2
    42
  end
end

calc = Calculator.new
calc.heavy_computation # => 42 (takes 2 seconds)
calc.heavy_computation # => 42 (instant, cached)

Inline syntax

memo def result
  expensive_call
end

Block syntax

memo
def result
  expensive_call
end

Access levels

Control visibility of the memoized method:

class Example
  memo def private_writer
    compute
  end, writer: :private

  memo writer: :private
  def private_writer
    compute
  end
end

Writer

You can also generate a writer to reset the memoized value:

class Example
  memo def value
    rand(100)
  end, writer: :public
end

obj = Example.new
obj.value # => 42
obj.value = 999
obj.value # => 999

Attribute Initialization (initialize_attr)

Declaratively define attributes with auto-generated initialize:

class User
  initialize_attr :name
  initialize_attr :email, required: :not_nil?
  initialize_attr :age,  required: :nil?
end

user = User.new(name: "Alice", email: "alice@example.com")
user.name  # => "Alice"
user.email # => "alice@example.com"
user.age   # => nil

With validation

class User
  initialize_attr :name, required: :not_nil?
  initialize_attr :email, required: :not_nil?
  initialize_attr :role,  required: :nil?
end

User.new(name: "Bob", email: "bob@example.com")
User.new(name: nil, email: "bob@example.com")
# => raises Memorium::AttributeRequired: Attribute `name` must be not_nil: nil

Attribute Validation (require_attr)

Validate attribute values at runtime:

class User
  initialize_attr :name, required: :not_nil?

  memo def name_caps = require_attr(:name).upcase
end

user = User.new(name: "alice")
user.name_caps # => "ALICE"

Available predicates:

  • :nil? — value must be nil
  • :not_nil? — value must not be nil
  • :not_empty? — value must not be empty
  • Any method name as a predicate (e.g., :zero?, :positive?)
  • Custom Proc: require_attr(:name, by: ->(v) { v.size > 2 })

Configuration

# By default, nil values are also memoized
Memorium.memoize_nil_values = true

# Disable nil memoization (nil will be recomputed each time)
Memorium.memoize_nil_values = false

Development

After checking out the repo, run bin/setup to install dependencies. Then run rake spec to run the tests.

bin/setup
rake spec

You can also run bin/console for an interactive prompt.

Contributing

Bug reports and pull requests are welcome at https://github.com/gem-forge/memorium.