Sha256: cf2870325d9bac416a92a5852984e57ade71279eba8d0f2d6607b4fc32978528

Contents?: true

Size: 728 Bytes

Versions: 1

Compression:

Stored size: 728 Bytes

Contents

module Potter
  module Enum
    def self.included(base)
      base.extend ClassMethods
    end

    module ClassMethods
      def next_id = @last_id ? @last_id += 1 : @last_id = 0

      def const(name, id = next_id, description: nil)
        @last_id = id
        const_set(name, id)
      end

      def cast(value)
        case value
        when Integer
          new(value)
        when Symbol, String
          const_get(value)
        end
      end
    end

    def self.of(type)
      parent = self
      name = type.name.gsub("::", "")
      const_get(name) ||
        const_set(type.name.gsub("::", ""), Class.new(type) do
          include parent
        end)
    end
  end

  def self.Enum(type) = Enum.of(type)
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
potter-0.1.0 lib/potter/enum.rb