module Myco::MemeBindable

Public Instance Methods

declare_meme(name, decorations=[], body=nil, cscope=nil, &blk) click to toggle source
# File lib/myco/bootstrap/meme.rb, line 8
def declare_meme name, decorations=[], body=nil, cscope=nil, &blk
  meme = Meme.new self, name
  if cscope && blk
    body = blk.block.dup
    blk = nil
    body.instance_variable_set(:@constant_scope, cscope)
  end
  meme.body = body || blk
  
  decorations = decorations.map do |decoration, arguments|
    decorators = main.category(:decorators)
    decorators = decorators && decorators.instance
    
    unless Rubinius::Type.object_respond_to?(decorators, decoration)
      reason = if !decorators
        "#{self} has no [decorators] category."
      else
        "Known decorators in #{decorators}: " \
        "#{decorators.component.memes.keys.inspect}."
      end
      raise KeyError,
        "Unknown decorator for #{self}##{name}: '#{decoration}'. #{reason}" 
    end
    
    [decorators.__send__(decoration), arguments]
  end
  decorations.each { |deco, args| deco.transforms.apply meme, *args }
  decorations.each { |deco, args| deco.apply meme, *args }
  
  meme.bind
  
  meme
end
memes() click to toggle source
# File lib/myco/bootstrap/meme.rb, line 4
def memes
  @memes ||= Rubinius::LookupTable.new
end