class MrDarcy::Role

Attributes

name[RW]
options[RW]

Public Class Methods

new(name, opts={}) click to toggle source
# File lib/mr_darcy/role.rb, line 5
def initialize name, opts={}, &block
  self.name    = name
  self.options = opts
  @module = Module.new(&block)
end

Public Instance Methods

clean(player) click to toggle source
# File lib/mr_darcy/role.rb, line 21
def clean player
  clean_singleton_methods player unless jruby?
end
pollute(player) click to toggle source
# File lib/mr_darcy/role.rb, line 11
def pollute player
  guard_against_false_players player

  if jruby?
    pollute_with_module_extension player
  else
    pollute_with_singleton_methods player
  end
end

Private Instance Methods

clean_singleton_methods(player) click to toggle source
# File lib/mr_darcy/role.rb, line 59
def clean_singleton_methods player
  @module.instance_methods.each do |method_name|
    player.singleton_class.send :remove_method, method_name if player.respond_to? method_name
  end
end
guard_against_false_players(player) click to toggle source
# File lib/mr_darcy/role.rb, line 31
def guard_against_false_players player
  options.each do |test_type, values|
    case test_type
    when :must_respond_to
      Array(values).each do |method_name|
        raise ArgumentError, "player must implement #{method_name}" unless player.respond_to? method_name
      end
    when :must_not_respond_to
      Array(values).each do |method_name|
        raise ArgumentError, "player must not implement #{method_name}" if player.respond_to? method_name
      end
    else
      raise ArgumentError, "unknown restriction #{test_type}"
    end
  end
end
jruby?() click to toggle source
# File lib/mr_darcy/role.rb, line 27
def jruby?
  RUBY_ENGINE == 'jruby'
end
pollute_with_module_extension(player) click to toggle source
# File lib/mr_darcy/role.rb, line 48
def pollute_with_module_extension player
  player.send :extend, @module
end
pollute_with_singleton_methods(player) click to toggle source
# File lib/mr_darcy/role.rb, line 52
def pollute_with_singleton_methods player
  @module.instance_methods.each do |method_name|
    implementation = @module.instance_method method_name
    player.define_singleton_method method_name, implementation
  end
end