Module: LazyLoad::Mixin

Included in:
LazyLoad
Defined in:
lib/lazy_load.rb

Defined Under Namespace

Classes: Wrapper

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.extended(obj) ⇒ Object



17
18
19
# File 'lib/lazy_load.rb', line 17

def self.extended(obj)
  obj.reset!
end

Instance Method Details

#best(*names) ⇒ Object Also known as: first_available, []

Return the first available dependency from the list of constant names.



63
64
65
66
67
68
69
70
71
72
# File 'lib/lazy_load.rb', line 63

def best(*names)
  names.map do |name|
    @groups[name] || name
  end.flatten.each do |name|
    begin
      return const_get(name)
    rescue NameError, LoadError; end
  end
  const_get(names.first)
end

#const(name, action = nil, &blk) ⇒ Object Also known as: dep



27
28
29
30
# File 'lib/lazy_load.rb', line 27

def const(name, action=nil, &blk)
  @actions[name]  = blk || action || raise(
    ArgumentError, "missing require path or callback")
end

#const_missing(name) ⇒ Object



42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
# File 'lib/lazy_load.rb', line 42

def const_missing(name)
  k = case action = @actions[name]
    when Proc   then action.call
    when nil    then super
    when String
      begin
        require @actions[name]
      rescue LoadError => boom
        raise(LoadError, boom.message +
          "\nPossible fix: gem install #{@actions[name]}")
      end
      Kernel.const_get(name)
    else raise "Invalid action for dependency #{action.inspect}"
  end
  k = @wrappers[name].new(k) if @wrappers[name]
  const_set(name, k)
end

#group(name, *constants) ⇒ Object Also known as: prefer



33
34
35
# File 'lib/lazy_load.rb', line 33

def group(name, *constants)
  @groups[name] = constants
end

#reset!Object



10
11
12
13
14
15
# File 'lib/lazy_load.rb', line 10

def reset!
  @actions  = {}
  @groups   = {}
  @wrappers = {}
  self
end

#scope(&blk) ⇒ Object



21
22
23
24
25
# File 'lib/lazy_load.rb', line 21

def scope(&blk)
  mod = Module.new.extend(LazyLoad::Mixin).reset!
  mod.module_eval(&blk) if blk
  mod
end

#unmap(name) ⇒ Object



38
39
40
# File 'lib/lazy_load.rb', line 38

def unmap(name)
  @actions.delete(name)
end

#wrap(name, &blk) ⇒ Object



76
77
78
79
80
# File 'lib/lazy_load.rb', line 76

def wrap(name, &blk)
  kls = Class.new(Wrapper)
  kls.class_eval(&blk)
  @wrappers[name] = kls
end