module ObjectEnum

Java-like Enum can be defined by include this module.
For example, an Enum with a simple single value can be written as:

class Role
  include ObjectEnum
  attr_reader :name

  def initialize(name)
    @name = name
  end

  CUSTOMER = new("customer")
  ADMIN    = new("admin")
end

# Find by role name
admin = Role.find(name: "admin")
Role::ADMIN == admin

If you want to switch implement on the role, you can keep your code simple by splitting the value into another class.

class RoleBase
  def label
    raise "Not implemented!!!"
  end
end
class Customer < RoleBase
  def label
    "customer"
  end
end
class Admin < RoleBase
  def label
    "admin"
  end
end
class Role
  include ObjectEnum

  CUSTOMER = Customer.new
  ADMIN    = Admin.new

  # Override enum_class method.
  def self.enum_class
    RoleBase
  end
end

Role::ADMIN.label == "admin"

Constants

VERSION

Public Class Methods

included(enum) click to toggle source
# File lib/object_enum.rb, line 52
def self.included(enum)
  enum.extend EnumClassMethods
  enum.private_class_method(:new)
end