Module: Monkey::Ext::ExtDSL

Included in:
ClassDsl
Defined in:
lib/monkey/ext.rb

Defined Under Namespace

Modules: ClassDsl

Instance Method Summary collapse

Instance Method Details

#alias_core_method(old_name, new_name) ⇒ Object



50
51
52
53
54
# File 'lib/monkey/ext.rb', line 50

def alias_core_method(old_name, new_name)
  new_name = new_name % old_name if new_name.is_a? String
  core_class.send :alias_method, new_name, old_name
  old_name
end

#class_methods(&block) ⇒ Object



67
68
69
# File 'lib/monkey/ext.rb', line 67

def class_methods(&block)
  self::ClassMethods.class_eval(&block)
end

#core_class(klass = nil) ⇒ Object



15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# File 'lib/monkey/ext.rb', line 15

def core_class(klass = nil)
  if klass
    @core_class = klass
    klass.send :include, self
    self::ClassMethods.extend ClassDsl
    self::ClassMethods.core_class @core_class
    @core_class.class_eval <<-EOS
      def method_missing(meth, *args, &blk)
        return super if Monkey::Backend.setup?
        Monkey::Backend.setup
        __send__(meth, *args, &blk)
      end
    EOS
    unless klass.is_a? Class
      # HACK: Don't modify modules while looping through object space.
      # JRuby does not like that.
      list = []
      ObjectSpace.each_object(Class) do |mod|
        list << mod if mod.ancestors.include? klass and not mod.ancestors.include? self
      end
      list.each { |e| e.send :include, klass }
    end
  end
  return @core_class
end

#expects(*list) ⇒ Object



71
72
73
74
75
# File 'lib/monkey/ext.rb', line 71

def expects(*list)
  list.each do |name|
    Monkey::Ext.expectations[core_class] << name.to_s
  end
end

#feature(name, mode = :instance, &block) ⇒ Object



56
57
58
59
60
61
62
63
64
65
# File 'lib/monkey/ext.rb', line 56

def feature(name, mode = :instance, &block)
  case mode
  when :instance then block.call
  when :class then class_methods(&block)
  when :shared
    feature(name, :instance, &block)
    feature(name, :class, &block)
  else raise ArgumentError, "unkown mode #{mode.inspect}"
  end
end

#included(klass) ⇒ Object



41
42
43
44
# File 'lib/monkey/ext.rb', line 41

def included(klass)
  klass.extend self::ClassMethods
  super
end

#rename_core_method(old_name, new_name) ⇒ Object



46
47
48
# File 'lib/monkey/ext.rb', line 46

def rename_core_method(old_name, new_name)
  core_class.send :undef_method, alias_core_method(old_name, new_name)
end