kind 3.1.0 → 5.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (100) hide show
  1. checksums.yaml +4 -4
  2. data/.tool-versions +1 -0
  3. data/.travis.sh +67 -12
  4. data/.travis.yml +7 -5
  5. data/CHANGELOG.md +1647 -0
  6. data/Gemfile +22 -7
  7. data/README.md +920 -486
  8. data/kind.gemspec +1 -1
  9. data/lib/kind.rb +2 -314
  10. data/lib/kind/__lib__/attributes.rb +66 -0
  11. data/lib/kind/__lib__/kind.rb +71 -0
  12. data/lib/kind/__lib__/undefined.rb +14 -0
  13. data/lib/kind/action.rb +92 -0
  14. data/lib/kind/active_model/validation.rb +3 -4
  15. data/lib/kind/basic.rb +73 -0
  16. data/lib/kind/basic/error.rb +29 -0
  17. data/lib/kind/{undefined.rb → basic/undefined.rb} +8 -1
  18. data/lib/kind/dig.rb +31 -11
  19. data/lib/kind/either.rb +30 -0
  20. data/lib/kind/either/left.rb +29 -0
  21. data/lib/kind/either/methods.rb +17 -0
  22. data/lib/kind/either/monad.rb +65 -0
  23. data/lib/kind/either/monad/wrapper.rb +19 -0
  24. data/lib/kind/either/right.rb +38 -0
  25. data/lib/kind/empty.rb +4 -10
  26. data/lib/kind/empty/constant.rb +7 -0
  27. data/lib/kind/enum.rb +63 -0
  28. data/lib/kind/enum/item.rb +40 -0
  29. data/lib/kind/enum/methods.rb +72 -0
  30. data/lib/kind/function.rb +47 -0
  31. data/lib/kind/functional.rb +89 -0
  32. data/lib/kind/functional/action.rb +89 -0
  33. data/lib/kind/immutable_attributes.rb +34 -0
  34. data/lib/kind/immutable_attributes/initializer.rb +70 -0
  35. data/lib/kind/immutable_attributes/reader.rb +38 -0
  36. data/lib/kind/maybe.rb +35 -159
  37. data/lib/kind/maybe/methods.rb +21 -0
  38. data/lib/kind/maybe/monad.rb +82 -0
  39. data/lib/kind/maybe/monad/wrapper.rb +19 -0
  40. data/lib/kind/maybe/none.rb +50 -0
  41. data/lib/kind/maybe/some.rb +132 -0
  42. data/lib/kind/maybe/typed.rb +35 -0
  43. data/lib/kind/maybe/wrapper.rb +37 -0
  44. data/lib/kind/monad.rb +22 -0
  45. data/lib/kind/monads.rb +5 -0
  46. data/lib/kind/objects.rb +17 -0
  47. data/lib/kind/objects/basic_object.rb +45 -0
  48. data/lib/kind/objects/modules.rb +32 -0
  49. data/lib/kind/objects/modules/core/array.rb +19 -0
  50. data/lib/kind/objects/modules/core/class.rb +13 -0
  51. data/lib/kind/objects/modules/core/comparable.rb +13 -0
  52. data/lib/kind/objects/modules/core/enumerable.rb +13 -0
  53. data/lib/kind/objects/modules/core/enumerator.rb +13 -0
  54. data/lib/kind/objects/modules/core/file.rb +13 -0
  55. data/lib/kind/objects/modules/core/float.rb +13 -0
  56. data/lib/kind/objects/modules/core/hash.rb +19 -0
  57. data/lib/kind/objects/modules/core/integer.rb +13 -0
  58. data/lib/kind/objects/modules/core/io.rb +13 -0
  59. data/lib/kind/objects/modules/core/method.rb +13 -0
  60. data/lib/kind/objects/modules/core/module.rb +17 -0
  61. data/lib/kind/objects/modules/core/numeric.rb +13 -0
  62. data/lib/kind/objects/modules/core/proc.rb +13 -0
  63. data/lib/kind/objects/modules/core/queue.rb +14 -0
  64. data/lib/kind/objects/modules/core/range.rb +13 -0
  65. data/lib/kind/objects/modules/core/regexp.rb +13 -0
  66. data/lib/kind/objects/modules/core/string.rb +19 -0
  67. data/lib/kind/objects/modules/core/struct.rb +13 -0
  68. data/lib/kind/objects/modules/core/symbol.rb +13 -0
  69. data/lib/kind/objects/modules/core/time.rb +13 -0
  70. data/lib/kind/objects/modules/custom/boolean.rb +19 -0
  71. data/lib/kind/objects/modules/custom/callable.rb +19 -0
  72. data/lib/kind/objects/modules/custom/lambda.rb +19 -0
  73. data/lib/kind/objects/modules/stdlib/open_struct.rb +15 -0
  74. data/lib/kind/objects/modules/stdlib/set.rb +19 -0
  75. data/lib/kind/objects/nil.rb +17 -0
  76. data/lib/kind/objects/not_nil.rb +13 -0
  77. data/lib/kind/objects/object.rb +56 -0
  78. data/lib/kind/objects/respond_to.rb +30 -0
  79. data/lib/kind/objects/union_type.rb +44 -0
  80. data/lib/kind/presence.rb +35 -0
  81. data/lib/kind/result.rb +31 -0
  82. data/lib/kind/result/abstract.rb +53 -0
  83. data/lib/kind/result/failure.rb +31 -0
  84. data/lib/kind/result/methods.rb +17 -0
  85. data/lib/kind/result/monad.rb +69 -0
  86. data/lib/kind/result/monad/wrapper.rb +19 -0
  87. data/lib/kind/result/success.rb +40 -0
  88. data/lib/kind/try.rb +46 -0
  89. data/lib/kind/validator.rb +112 -1
  90. data/lib/kind/version.rb +1 -1
  91. data/test.sh +4 -4
  92. metadata +81 -13
  93. data/lib/kind/active_model/kind_validator.rb +0 -96
  94. data/lib/kind/checker.rb +0 -15
  95. data/lib/kind/checker/factory.rb +0 -35
  96. data/lib/kind/checker/protocol.rb +0 -73
  97. data/lib/kind/error.rb +0 -19
  98. data/lib/kind/is.rb +0 -19
  99. data/lib/kind/of.rb +0 -11
  100. data/lib/kind/types.rb +0 -115
data/lib/kind/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Kind
4
- VERSION = '3.1.0'
4
+ VERSION = '5.2.0'
5
5
  end
data/test.sh CHANGED
@@ -1,11 +1,11 @@
1
1
  #!/bin/bash
2
2
 
3
- bundle
4
-
5
- rm Gemfile.lock
6
-
7
3
  source $(dirname $0)/.travis.sh
8
4
 
5
+ echo ''
6
+ echo 'Resetting Gemfile'
7
+ echo ''
8
+
9
9
  rm Gemfile.lock
10
10
 
11
11
  bundle
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kind
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.1.0
4
+ version: 5.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Rodrigo Serradura
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-07-08 00:00:00.000000000 Z
11
+ date: 2021-03-18 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: A simple type system (at runtime) for Ruby - free of dependencies.
14
14
  email:
@@ -18,8 +18,10 @@ extensions: []
18
18
  extra_rdoc_files: []
19
19
  files:
20
20
  - ".gitignore"
21
+ - ".tool-versions"
21
22
  - ".travis.sh"
22
23
  - ".travis.yml"
24
+ - CHANGELOG.md
23
25
  - CODE_OF_CONDUCT.md
24
26
  - Gemfile
25
27
  - LICENSE.txt
@@ -29,19 +31,85 @@ files:
29
31
  - bin/setup
30
32
  - kind.gemspec
31
33
  - lib/kind.rb
32
- - lib/kind/active_model/kind_validator.rb
34
+ - lib/kind/__lib__/attributes.rb
35
+ - lib/kind/__lib__/kind.rb
36
+ - lib/kind/__lib__/undefined.rb
37
+ - lib/kind/action.rb
33
38
  - lib/kind/active_model/validation.rb
34
- - lib/kind/checker.rb
35
- - lib/kind/checker/factory.rb
36
- - lib/kind/checker/protocol.rb
39
+ - lib/kind/basic.rb
40
+ - lib/kind/basic/error.rb
41
+ - lib/kind/basic/undefined.rb
37
42
  - lib/kind/dig.rb
43
+ - lib/kind/either.rb
44
+ - lib/kind/either/left.rb
45
+ - lib/kind/either/methods.rb
46
+ - lib/kind/either/monad.rb
47
+ - lib/kind/either/monad/wrapper.rb
48
+ - lib/kind/either/right.rb
38
49
  - lib/kind/empty.rb
39
- - lib/kind/error.rb
40
- - lib/kind/is.rb
50
+ - lib/kind/empty/constant.rb
51
+ - lib/kind/enum.rb
52
+ - lib/kind/enum/item.rb
53
+ - lib/kind/enum/methods.rb
54
+ - lib/kind/function.rb
55
+ - lib/kind/functional.rb
56
+ - lib/kind/functional/action.rb
57
+ - lib/kind/immutable_attributes.rb
58
+ - lib/kind/immutable_attributes/initializer.rb
59
+ - lib/kind/immutable_attributes/reader.rb
41
60
  - lib/kind/maybe.rb
42
- - lib/kind/of.rb
43
- - lib/kind/types.rb
44
- - lib/kind/undefined.rb
61
+ - lib/kind/maybe/methods.rb
62
+ - lib/kind/maybe/monad.rb
63
+ - lib/kind/maybe/monad/wrapper.rb
64
+ - lib/kind/maybe/none.rb
65
+ - lib/kind/maybe/some.rb
66
+ - lib/kind/maybe/typed.rb
67
+ - lib/kind/maybe/wrapper.rb
68
+ - lib/kind/monad.rb
69
+ - lib/kind/monads.rb
70
+ - lib/kind/objects.rb
71
+ - lib/kind/objects/basic_object.rb
72
+ - lib/kind/objects/modules.rb
73
+ - lib/kind/objects/modules/core/array.rb
74
+ - lib/kind/objects/modules/core/class.rb
75
+ - lib/kind/objects/modules/core/comparable.rb
76
+ - lib/kind/objects/modules/core/enumerable.rb
77
+ - lib/kind/objects/modules/core/enumerator.rb
78
+ - lib/kind/objects/modules/core/file.rb
79
+ - lib/kind/objects/modules/core/float.rb
80
+ - lib/kind/objects/modules/core/hash.rb
81
+ - lib/kind/objects/modules/core/integer.rb
82
+ - lib/kind/objects/modules/core/io.rb
83
+ - lib/kind/objects/modules/core/method.rb
84
+ - lib/kind/objects/modules/core/module.rb
85
+ - lib/kind/objects/modules/core/numeric.rb
86
+ - lib/kind/objects/modules/core/proc.rb
87
+ - lib/kind/objects/modules/core/queue.rb
88
+ - lib/kind/objects/modules/core/range.rb
89
+ - lib/kind/objects/modules/core/regexp.rb
90
+ - lib/kind/objects/modules/core/string.rb
91
+ - lib/kind/objects/modules/core/struct.rb
92
+ - lib/kind/objects/modules/core/symbol.rb
93
+ - lib/kind/objects/modules/core/time.rb
94
+ - lib/kind/objects/modules/custom/boolean.rb
95
+ - lib/kind/objects/modules/custom/callable.rb
96
+ - lib/kind/objects/modules/custom/lambda.rb
97
+ - lib/kind/objects/modules/stdlib/open_struct.rb
98
+ - lib/kind/objects/modules/stdlib/set.rb
99
+ - lib/kind/objects/nil.rb
100
+ - lib/kind/objects/not_nil.rb
101
+ - lib/kind/objects/object.rb
102
+ - lib/kind/objects/respond_to.rb
103
+ - lib/kind/objects/union_type.rb
104
+ - lib/kind/presence.rb
105
+ - lib/kind/result.rb
106
+ - lib/kind/result/abstract.rb
107
+ - lib/kind/result/failure.rb
108
+ - lib/kind/result/methods.rb
109
+ - lib/kind/result/monad.rb
110
+ - lib/kind/result/monad/wrapper.rb
111
+ - lib/kind/result/success.rb
112
+ - lib/kind/try.rb
45
113
  - lib/kind/validator.rb
46
114
  - lib/kind/version.rb
47
115
  - test.sh
@@ -59,14 +127,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
59
127
  requirements:
60
128
  - - ">="
61
129
  - !ruby/object:Gem::Version
62
- version: 2.2.0
130
+ version: 2.1.0
63
131
  required_rubygems_version: !ruby/object:Gem::Requirement
64
132
  requirements:
65
133
  - - ">="
66
134
  - !ruby/object:Gem::Version
67
135
  version: '0'
68
136
  requirements: []
69
- rubygems_version: 3.0.6
137
+ rubygems_version: 3.2.11
70
138
  signing_key:
71
139
  specification_version: 4
72
140
  summary: A simple type system (at runtime) for Ruby.
@@ -1,96 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class KindValidator < ActiveModel::EachValidator
4
- def validate_each(record, attribute, value)
5
- return if options[:allow_nil] && value.nil?
6
-
7
- return unless error = call_validation_for(attribute, value)
8
-
9
- raise Kind::Error.new("#{attribute} #{error}") if options[:strict]
10
-
11
- record.errors.add(attribute, error)
12
- end
13
-
14
- private
15
-
16
- def call_validation_for(attribute, value)
17
- expected = options[:with] || options[:in]
18
-
19
- return validate_with_default_strategy(expected, value) if expected
20
-
21
- return kind_of(expected, value) if expected = options[:of]
22
- return kind_is(expected, value) if expected = options[:is]
23
- return respond_to(expected, value) if expected = options[:respond_to]
24
- return instance_of(expected, value) if expected = options[:instance_of]
25
- return array_with(expected, value) if expected = options[:array_with]
26
- return array_of(expected, value) if expected = options[:array_of]
27
-
28
- raise Kind::Validator::InvalidDefinition.new(attribute)
29
- end
30
-
31
- def validate_with_default_strategy(expected, value)
32
- send(Kind::Validator.default_strategy, expected, value)
33
- end
34
-
35
- def kind_of(expected, value)
36
- types = Array(expected)
37
-
38
- return if types.any? { |type| value.kind_of?(type) }
39
-
40
- "must be a kind of: #{types.map { |klass| klass.name }.join(', ')}"
41
- end
42
-
43
- CLASS_OR_MODULE = 'Class/Module'.freeze
44
-
45
- def kind_is(expected, value)
46
- return kind_is_not(expected, value) unless expected.kind_of?(Array)
47
-
48
- result = expected.map { |kind| kind_is_not(kind, value) }.compact
49
-
50
- result.empty? || result.size < expected.size ? nil : result.join(', ')
51
- end
52
-
53
- def kind_is_not(expected, value)
54
- case expected
55
- when Class
56
- return if expected == Kind.of.Class(value) || value < expected
57
-
58
- "must be the class or a subclass of `#{expected.name}`"
59
- when Module
60
- return if value.kind_of?(Class) && value <= expected
61
- return if expected == Kind.of.Module(value) || value.kind_of?(expected)
62
-
63
- "must include the `#{expected.name}` module"
64
- else
65
- raise Kind::Error.new(CLASS_OR_MODULE, expected)
66
- end
67
- end
68
-
69
- def respond_to(method_name, value)
70
- return if value.respond_to?(method_name)
71
-
72
- "must respond to the method `#{method_name}`"
73
- end
74
-
75
- def instance_of(expected, value)
76
- types = Array(expected)
77
-
78
- return if types.any? { |type| value.instance_of?(type) }
79
-
80
- "must be an instance of: #{types.map { |klass| klass.name }.join(', ')}"
81
- end
82
-
83
- def array_with(expected, value)
84
- return if value.kind_of?(Array) && !value.empty? && (value - Kind.of.Array(expected)).empty?
85
-
86
- "must be an array with: #{expected.join(', ')}"
87
- end
88
-
89
- def array_of(expected, value)
90
- types = Array(expected)
91
-
92
- return if value.kind_of?(Array) && !value.empty? && value.all? { |value| types.any? { |type| value.kind_of?(type) } }
93
-
94
- "must be an array of: #{types.map { |klass| klass.name }.join(', ')}"
95
- end
96
- end
data/lib/kind/checker.rb DELETED
@@ -1,15 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'kind/checker/factory'
4
- require 'kind/checker/protocol'
5
- module Kind
6
- class Checker
7
- include Protocol
8
-
9
- attr_reader :__kind
10
-
11
- def initialize(kind)
12
- @__kind = kind
13
- end
14
- end
15
- end
@@ -1,35 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'singleton'
4
-
5
- module Kind
6
- class Checker
7
- class Factory
8
- include Singleton
9
-
10
- def self.create(kind)
11
- instance.create(kind)
12
- end
13
-
14
- def initialize
15
- @__checkers__ = {}
16
- end
17
-
18
- MODULE_OR_CLASS = 'Module/Class'.freeze
19
-
20
- private_constant :MODULE_OR_CLASS
21
-
22
- def create(kind)
23
- @__checkers__[kind] ||= begin
24
- kind_name = kind.name
25
-
26
- if Kind::Of.const_defined?(kind_name, false)
27
- Kind::Of.const_get(kind_name)
28
- else
29
- Kind::Checker.new(Kind::Of.(Module, kind, MODULE_OR_CLASS))
30
- end
31
- end
32
- end
33
- end
34
- end
35
- end
@@ -1,73 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Kind
4
- class Checker
5
- module Protocol
6
- def class?(value)
7
- Kind::Is.__call__(__kind, value)
8
- end
9
-
10
- def instance(value, options = Empty::HASH)
11
- default = options[:or]
12
-
13
- return Kind::Of.(__kind, value) if ::Kind::Maybe::Value.none?(default)
14
-
15
- Kind::Undefined != value && instance?(value) ? value : Kind::Of.(__kind, default)
16
- end
17
-
18
- def [](value, options = options = Empty::HASH)
19
- instance(value, options)
20
- end
21
-
22
- def to_proc
23
- @to_proc ||=
24
- -> checker { -> value { checker.instance(value) } }.call(self)
25
- end
26
-
27
- def __is_instance__(value)
28
- value.kind_of?(__kind)
29
- end
30
-
31
- def is_instance_to_proc
32
- @is_instance_to_proc ||=
33
- -> checker { -> value { checker.__is_instance__(value) } }.call(self)
34
- end
35
-
36
- def instance?(*args)
37
- return is_instance_to_proc if args.empty?
38
-
39
- return args.all? { |object| __is_instance__(object) } if args.size > 1
40
-
41
- arg = args[0]
42
- Kind::Undefined == arg ? is_instance_to_proc : __is_instance__(arg)
43
- end
44
-
45
- def or_nil(value)
46
- return value if instance?(value)
47
- end
48
-
49
- def or_undefined(value)
50
- or_nil(value) || Kind::Undefined
51
- end
52
-
53
- def __as_maybe__(value)
54
- Kind::Maybe.new(or_nil(value))
55
- end
56
-
57
- def as_maybe_to_proc
58
- @as_maybe_to_proc ||=
59
- -> checker { -> value { checker.__as_maybe__(value) } }.call(self)
60
- end
61
-
62
- def as_maybe(value = Kind::Undefined)
63
- return __as_maybe__(value) if Kind::Undefined != value
64
-
65
- as_maybe_to_proc
66
- end
67
-
68
- def as_optional(value = Kind::Undefined)
69
- as_maybe(value)
70
- end
71
- end
72
- end
73
- end
data/lib/kind/error.rb DELETED
@@ -1,19 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Kind
4
- class Error < TypeError
5
- UNDEFINED_OBJECT = Object.new
6
-
7
- private_constant :UNDEFINED_OBJECT
8
-
9
- def initialize(arg, object = UNDEFINED_OBJECT)
10
- if UNDEFINED_OBJECT == object
11
- # Will be used when the exception was raised with a message. e.g:
12
- # raise Kind::Error, "some message"
13
- super(arg)
14
- else
15
- super("#{object.inspect} expected to be a kind of #{arg}")
16
- end
17
- end
18
- end
19
- end
data/lib/kind/is.rb DELETED
@@ -1,19 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Kind
4
- module Is
5
- def self.call(expected, object)
6
- __call__(Kind::Of.Module(expected), object)
7
- end
8
-
9
- def self.__call__(expected_kind, object)
10
- kind = Kind::Of.Module(object)
11
-
12
- if kind.is_a?(Class)
13
- kind <= expected_kind || false
14
- else
15
- kind == expected_kind || kind.is_a?(expected_kind)
16
- end
17
- end
18
- end
19
- end
data/lib/kind/of.rb DELETED
@@ -1,11 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Kind
4
- module Of
5
- def self.call(kind, object, kind_name = nil)
6
- return object if kind === object
7
-
8
- raise Kind::Error.new(kind_name || kind.name, object)
9
- end
10
- end
11
- end
data/lib/kind/types.rb DELETED
@@ -1,115 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Kind
4
- module Types
5
- extend self
6
-
7
- COLONS = '::'.freeze
8
-
9
- KIND_OF = <<-RUBY
10
- def self.%{method_name}(object = Undefined, options = Empty::HASH)
11
- default = options[:or]
12
-
13
- return Kind::Of::%{kind_name} if Undefined == object && default.nil?
14
-
15
- is_instance = Kind::Of::%{kind_name}.__is_instance__(object)
16
-
17
- return object if is_instance
18
-
19
- Kind::Of.(::%{kind_name_to_check}, object && default ? default : object || default)
20
- end
21
- RUBY
22
-
23
- KIND_OF_IS = <<-RUBY
24
- def self.%{method_name}?(*args)
25
- Kind::Of::%{kind_name}.instance?(*args)
26
- end
27
- RUBY
28
-
29
- KIND_IS = <<-RUBY
30
- def self.%{method_name}(value = Undefined)
31
- return Kind::Is::%{kind_name} if Undefined == value
32
-
33
- Kind::Is.__call__(::%{kind_name_to_check}, value)
34
- end
35
- RUBY
36
-
37
- private_constant :KIND_OF, :KIND_IS, :COLONS
38
-
39
- def add(kind, name: nil)
40
- kind_name = Kind.of.Module(kind).name
41
- checker = name ? Kind::Of.(String, name) : kind_name
42
-
43
- if checker.include?(COLONS)
44
- add_kind_with_namespace(checker, method_name: name)
45
- else
46
- add_root(checker, kind_name, method_name: name,
47
- kind_name_to_check: kind_name,
48
- create_kind_is_mod: false)
49
- end
50
- end
51
-
52
- private
53
-
54
- def add_root(checker, kind_name, method_name:, create_kind_is_mod:, kind_name_to_check: nil)
55
- root_kind_name = method_name ? method_name : kind_name
56
-
57
- params = {
58
- method_name: method_name ? method_name : checker,
59
- kind_name: method_name ? method_name : kind_name,
60
- kind_name_to_check: kind_name_to_check || root_kind_name
61
- }
62
-
63
- add_kind(params, Kind::Of, Kind::Is, create_kind_is_mod)
64
- end
65
-
66
- def add_kind_with_namespace(checker, method_name:)
67
- raise NotImplementedError if method_name
68
-
69
- const_names = checker.split(COLONS)
70
- const_names.each_with_index do |const_name, index|
71
- if index == 0
72
- add_root(const_name, const_name, method_name: nil, create_kind_is_mod: true)
73
- else
74
- add_node(const_names, index)
75
- end
76
- end
77
- end
78
-
79
- def add_node(const_names, index)
80
- namespace = const_names[0..(index-1)]
81
- namespace_name = namespace.join(COLONS)
82
-
83
- kind_of_mod = Kind::Of.const_get(namespace_name)
84
- kind_is_mod = Kind::Is.const_get(namespace_name)
85
-
86
- checker = const_names[index]
87
- kind_name = const_names[0..index].join(COLONS)
88
-
89
- params = { method_name: checker, kind_name: kind_name }
90
-
91
- add_kind(params, kind_of_mod, kind_is_mod, true)
92
- end
93
-
94
- def add_kind(params, kind_of_mod, kind_is_mod, create_kind_is_mod)
95
- method_name = params[:method_name]
96
-
97
- unless kind_of_mod.respond_to?(method_name)
98
- kind_name = params[:kind_name]
99
- params[:kind_name_to_check] ||= kind_name
100
-
101
- kind_checker = ::Module.new { extend Checker::Protocol }
102
- kind_checker.module_eval("def self.__kind; #{params[:kind_name_to_check]}; end")
103
-
104
- kind_of_mod.instance_eval(KIND_OF % params)
105
- kind_of_mod.const_set(method_name, kind_checker)
106
- kind_of_mod.instance_eval(KIND_OF_IS % params)
107
- end
108
-
109
- unless kind_is_mod.respond_to?(method_name)
110
- kind_is_mod.instance_eval(KIND_IS % params)
111
- kind_is_mod.const_set(method_name, Module.new) if create_kind_is_mod
112
- end
113
- end
114
- end
115
- end