Skip to content

Feature Envy enhances Ruby with features inspired by other programming languages

Notifications You must be signed in to change notification settings

gregnavis/feature_envy

Repository files navigation

Feature Envy

Feature Envy enhances Ruby with features found in other programming languages.

WARNING: This gem is still in development and a stable release hasn't been made yet. Bug reports and contributions are welcome!

Supported features:

  • Final classes
  • Thread-safe lazy accessors
  • Object literals
  • Inspect (inspired by Elixir's Kernel.inspect/2)

Installation

You can install the gem by running gem install feature_envy or adding it to Gemfile:

gem "feature_envy"

Don't forget to run bundle install afterwards.

Usage

Below are example snippets for a quick start with the project. Please refer to individual feature documentation for details. Features are designed to be independent and should be enabled one-by-one.

Final Classes

module Models
  # Enable the feature in a given module via the using directive.
  using FeatureEnvy::FinalClass

  class Admin < User
    # Call final! inside the definition of a class you want to mark final.
    final!
  end
end

Lazy Accessors

class User
  # Enable the feature in a given class via the using directive. Alternatively,
  # you can enable it in a higher-level module, so that all classes defined in
  # support lazy accessors.
  using FeatureEnvy::LazyAccessor

  # These are some attributes that will be used by the lazy accessor.
  attr_accessor :first_name, :last_name

  # full_name is computed in a thread-safe fashion, and is lazy, i.e. it's
  # computed on first access and then cached.
  lazy(:full_name) { "#{first_name}" "#{last_name}" }
end

Object Literals

# Object literals are inspired by JavaScript and enable inline object definition
# that mixes both attributes and methods. Consider the example below:
app = object do
  @database = create_database_connection
  @router   = create_router

  def start
    @database.connect
    @router.start
  end
end

# app has @database and @router as attributes and responds to #start.
app.start

Inspect

# Elixir-style inspect for debugging during development and testing. First,
# make #inspect! available on all objects.
class BasicObject
  include FeatureEnvy::Inspect
end

# Second, configure how objects are inspected and where the results are sent.
# In this case, we just call the regular #inspect and send results to stderr.
FeatureEnvy::Inspect.inspector = FeatureEnvy::Inspect::InspectInspector
FeatureEnvy::Inspect.output = $stderr

# Alternatively, in a Rails app:
FeatureEnvy::Inspect.output = FeatureEnvy::Inspect::LoggerAdapter.new Rails.logger

# Now, inspect! is ready to use. For example, this will print the user to stderr
# or via the logger, depending on which output above was chosen.
User.find(5).inspect!

Author

This gem is developed and maintained by Greg Navis.

About

Feature Envy enhances Ruby with features inspired by other programming languages

Resources

Stars

Watchers

Forks

Packages

No packages published

Languages