Skip to content

Commit 96b8485

Browse files
committed
Implement experimentally singleton
1 parent 5fbd957 commit 96b8485

File tree

1 file changed

+28
-0
lines changed

1 file changed

+28
-0
lines changed

lib/rekkyo/type.rb

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
# frozen_string_literal: true
22

33
require "set"
4+
require "singleton"
5+
require "forwardable"
46

57
module Rekkyo
68
module Type
@@ -12,6 +14,32 @@ def included(klass)
1214
klass.extend(DSLMethods)
1315
klass.extend(EnumMethods)
1416
end
17+
18+
def create(member_names)
19+
::Class.new do
20+
include ::Singleton
21+
extend ::SingleForwardable
22+
23+
include EnumMethods
24+
def_single_delegators :instance, :all, :members, :freeze
25+
26+
const_set(:Member, ::Class.new(Member))
27+
28+
define_method :initialize do
29+
member_class = self.class.const_get(:Member, false)
30+
@members = ::Set.new
31+
member_names.each do |member_name|
32+
member = member_class.new(member_name.upcase.to_sym, member_name).freeze
33+
@members << member
34+
self.class.const_set(member.key, member)
35+
end
36+
@members.freeze
37+
end
38+
39+
instance # define a class and instantiate it
40+
freeze
41+
end
42+
end
1543
end
1644
end
1745
end

0 commit comments

Comments
 (0)