Class: Predef

Inherits:
Module
  • Object
show all
Defined in:
lib/predef.rb

Defined Under Namespace

Modules: Refinements Classes: Error

Constant Summary collapse

VERSION =
'0.8.0'

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(klass) ⇒ Predef



45
46
47
# File 'lib/predef.rb', line 45

def initialize klass
  prepend_features klass
end

Class Method Details

.predef(klass, method_name, &definition) ⇒ Object



6
7
8
9
10
11
12
# File 'lib/predef.rb', line 6

def self.predef klass, method_name, &definition
  unless klass.public_method_defined? method_name
    raise ::Predef::Error, "#{klass}##{method_name} is not defined! Use `Predef.predef!` if you want to define a new method."
  end

  predef! klass, method_name, &definition
end

.predef!(klass, method_name, &definition) ⇒ Object



14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# File 'lib/predef.rb', line 14

def self.predef! klass, method_name, &definition
  if defined? klass.__PREDEF__
    instance = klass.__PREDEF__
  else
    instance = new(klass)

    singleton_class = class << klass; self ; end
    singleton_class.class_eval do
      define_method(:__PREDEF__) { instance }
    end
  end

  instance.module_eval do
    define_method(method_name, &definition)
  end
  method_name
end

.unpredef(klass, method_name) ⇒ Object



32
33
34
35
36
37
# File 'lib/predef.rb', line 32

def self.unpredef klass, method_name
  if !(defined? klass.__PREDEF__) || !(klass.__PREDEF__.public_method_defined? method_name)
    raise ::Predef::Error, "#{klass}##{method_name} has never been predef-ed!"
  end
  self.unpredef! klass, method_name
end

.unpredef!(klass, method_name) ⇒ Object



39
40
41
42
43
# File 'lib/predef.rb', line 39

def self.unpredef! klass, method_name
  klass.__PREDEF__.module_eval do
    remove_method method_name
  end
end