Module: Cube
- Defined in:
- lib/cube/interfaces.rb,
lib/cube/traits.rb,
lib/cube/toplevel.rb
Overview
Top level module for RubyCube
Defined Under Namespace
Modules: CubeMethods, Interface, Trait
Class Method Summary collapse
- .[](mod) ⇒ Object (also: from)
- .check_type(*_) ⇒ Object
- .check_type_spec(t, v, &blk) ⇒ Object
- .interface(&block) ⇒ Object
- .mark_interface!(cls, iface) ⇒ Object
- .trait(&blk) ⇒ Object
- .with_super(mod) ⇒ Object
Class Method Details
.[](mod) ⇒ Object Also known as: from
8 9 10 11 12 13 14 |
# File 'lib/cube/toplevel.rb', line 8 def self.[](mod) return mod if mod.is_a?(CubeMethods) unless mod.is_a?(Class) raise ArgumentError, "Only classes can be be converted to Cube classes" end Class.new(mod).extend(CubeMethods) end |
.check_type(*_) ⇒ Object
65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 |
# File 'lib/cube/toplevel.rb', line 65 def self.check_type(t, v) if t.is_a?(Set) unless t.any? { |tp| check_type(tp, v) rescue false } raise Cube::Interface::TypeMismatchError, "#{v.inspect} is not any of #{t.to_a}" end return end if t.is_a? Array raise Cube::Interface::TypeMismatchError, "#{v} is not an Array" unless v.is_a? Array check_type(t.first, v.first) check_type(t.first, v.last) return end raise Cube::Interface::TypeMismatchError, "#{v.inspect} is not type #{t}" unless v.is_a? t true end |
.check_type_spec(t, v, &blk) ⇒ Object
39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
# File 'lib/cube/toplevel.rb', line 39 def self.check_type_spec(t, v, &blk) if t.is_a?(Set) if v.is_a?(Set) if v != t raise Cube::Interface::TypeMismatchError, "#{t.to_a} is not eql to #{v.to_a}" end return true end unless t.any? { |tp| check_type(tp, v, &blk) rescue false } raise Cube::Interface::TypeMismatchError, "#{v.inspect} is not any of #{t.to_a}" end return end if t.is_a? Array raise Cube::Interface::TypeMismatchError, "#{v} is not an Array" unless v.is_a? Array check_type(t.first, v.first, &blk) check_type(t.first, v.last, &blk) return end raise Cube::Interface::TypeMismatchError, "#{v.inspect} is not type #{t}" unless blk.call(t, v) true end |
.interface(&block) ⇒ Object
24 25 26 27 28 29 30 |
# File 'lib/cube/toplevel.rb', line 24 def self.interface(&block) mod = Module.new mod.extend(Cube::Interface) mod.instance_variable_set('@ids', {}) mod.instance_eval(&block) mod end |
.mark_interface!(cls, iface) ⇒ Object
2 3 4 5 6 |
# File 'lib/cube/toplevel.rb', line 2 def self.mark_interface!(cls, iface) Cube[cls].as_interface(iface, runtime_checks: false) cl_iface = iface.impotent cls.include(cl_iface) end |
.trait(&blk) ⇒ Object
32 33 34 35 36 37 |
# File 'lib/cube/toplevel.rb', line 32 def self.trait(&blk) m = Module.new m.extend(Cube::Trait) m.module_exec(&blk) if block_given? m end |
.with_super(mod) ⇒ Object
16 17 18 |
# File 'lib/cube/toplevel.rb', line 16 def self.with_super(mod) self[Class.new(mod)] end |