Module: Reindeer::Role

Included in:
TypeConstraint
Defined in:
lib/reindeer/role.rb

Defined Under Namespace

Modules: TypeConstraint Classes: RoleError

Class Method Summary collapse

Class Method Details

.included(mod) ⇒ Object



5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# File 'lib/reindeer/role.rb', line 5

def Role.included(mod)
  mod.module_eval {
    class << self;
      meta = Reindeer::Meta.new(self)
      define_method :role_meta, Proc.new { meta }
      
      # Make this more composable?
      define_method :has, Proc.new { |name, opts={}|
        role_meta.add_attribute(name, opts)
      }
      
      define_method :requires, Proc.new { |method|
        role_meta.add_required_method(method)
      }

      define_method :assert_requires, Proc.new { |klass|
        not_defined = role_meta.required_methods.select do |meth|
          not klass.instance_methods(false).include?(meth)
        end

        return if not_defined.empty?
        raise RoleError, "The class '#{klass}' composed '#{self}' but didn't define #{not_defined.join ', '}"
      }
    end
  }
end