2014-06-29 00:07:43 +02:00
|
|
|
module Middleman
|
|
|
|
module CoreExtensions
|
|
|
|
module Collections
|
|
|
|
class LazyCollectorStep < BasicObject
|
2016-01-14 20:21:42 +01:00
|
|
|
DELEGATE = [:hash, :eql?].freeze
|
2014-06-29 00:07:43 +02:00
|
|
|
|
|
|
|
def initialize(name, args, block, parent=nil)
|
|
|
|
@name = name
|
|
|
|
@args = args
|
|
|
|
@block = block
|
|
|
|
|
|
|
|
@parent = parent
|
|
|
|
@result = nil
|
|
|
|
|
|
|
|
leaves << self
|
|
|
|
end
|
|
|
|
|
|
|
|
def leaves
|
|
|
|
@parent.leaves
|
|
|
|
end
|
|
|
|
|
|
|
|
def value(ctx=nil)
|
|
|
|
data = @parent.value(ctx)
|
|
|
|
|
|
|
|
original_block = @block
|
|
|
|
|
|
|
|
b = if ctx
|
|
|
|
::Proc.new do |*args|
|
|
|
|
ctx.instance_exec(*args, &original_block)
|
|
|
|
end
|
|
|
|
else
|
|
|
|
original_block
|
|
|
|
end if original_block
|
|
|
|
|
|
|
|
data.send(@name, *@args.deep_dup, &b)
|
|
|
|
end
|
|
|
|
|
|
|
|
def method_missing(name, *args, &block)
|
|
|
|
return ::Kernel.send(name, *args, &block) if DELEGATE.include? name
|
|
|
|
|
|
|
|
leaves.delete self
|
|
|
|
|
|
|
|
LazyCollectorStep.new(name, args, block, self)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|