Upload
denis-defreyne
View
590
Download
0
Embed Size (px)
Citation preview
% cat ddfreyne.txt
DENIS DEFREYNE==============
web: http://stoneship.orgtwitter: ddfreyne
nanoc: a static ruby web site publishing systemhttp://nanoc.stoneship.org/
% _
Metaprogramming is the writing of computer
programs that write or manipulate other
programs (or themselves) as their data.
class Module
def my_attr_reader(*fields) fields.each do |field|
class_eval " def #{field} @#{field} end "
end end
end
class Module
def my_attr_reader(*fields) fields.each do |field|
class_eval " def #{field} @#{field} end "
end end
end
class Module
def my_attr_reader(*fields) fields.each do |field|
class_eval " def #{field} @#{field} end "
end end
end
class Module
def my_attr_reader(*fields) fields.each do |field|
class_eval " def #{field} @#{field} end "
end end
end
class Module
def battr_reader(*fields) fields.each do |field|
class_eval " def #{field}? !!@#{field} end "
end end
end
template = "<p>Hello. My name is <%= @first_name %>.</p>"
@first_name = "Bob"
p ERB.new(template).result
class Product def initialize @title = "My First Ruby Book" @id = "39t8zfeg" endend
template = "<p>Product <%= @id %> has title <%= @title %>.</p>"
product = Product.new
# TODO use the product details p ERB.new(template).result
class Product def initialize @title = "My First Ruby Book" @id = "39t8zfeg" end
def print template = "<p>Product <%= @id %> has title <%= @title %>.</p>"
puts ERB.new(template).result(binding) endend
class Product def initialize @title = "My First Ruby Book" @id = "39t8zfeg" end
def print template = "<p>Product <%= @id %> has title <%= @title %>.</p>"
puts ERB.new(template).result(binding) endend
class Product
def initialize @title = "My First Ruby Book" @id = "39t8zfeg" end
def get_binding binding end
end
template = "<p>Product <%= @id %> has title <%= @title %>.</p>"
product = Product.new
p ERB.new(template).result
template = "<p>Product <%= @id %> has title <%= @title %>.</p>"
product = Product.new
p ERB.new(template).result(product.get_binding)
items = [ Item.new('foo'), Item.new('foobar'), Item.new('quxbar'), Item.new('moo')]
magically_load_rules
items.each do |item| magically_process(item)end
class Rule
def initialize(pattern, block) @pattern = pattern @block = block end
def applicable_to?(item) item.identifier =~ @pattern end
def apply_to(item) @block.call(item) end
end
class Application
def initialize @rules = [] end
def load_rules rules_content = File.read('Rules') dsl = DSL.new(@rules) dsl.instance_eval(rules_content) end
⋮
class Application
def initialize @rules = [] end
def load_rules rules_content = File.read('Rules') dsl = DSL.new(@rules) dsl.instance_eval(rules_content) end
⋮
class Application
def initialize @rules = [] end
def load_rules rules_content = File.read('Rules') dsl = DSL.new(@rules) dsl.instance_eval(rules_content) end
⋮
class DSL
def initialize(rules) @rules = rules end
def process(pattern, &block) @rules << Rule.new(pattern, block) end
end
class DSL
def initialize(rules) @rules = rules end
def process(pattern, &block) @rules << Rule.new(pattern, block) end
end
items = [ Item.new('foo'), Item.new('foobar'), Item.new('quxbar'), Item.new('moo')]
app = App.newapp.load_rules
items.each do |item| app.process(item)end
class Rule
def initialize(pattern, block) @pattern = pattern @block = block end
def applicable_to?(item) item.identifier =~ @pattern end
def apply_to(item) # original way: @block.call(item) end
end
class Rule
def initialize(pattern, block) @pattern = pattern @block = block end
def applicable_to?(item) item.identifier =~ @pattern end
def apply_to(item) rule_context = RuleContext.new(item) rule_context.instance_eval(&@block) end
end
‣ The Ruby Object Modeland Metaprogramminghttp://www.pragprog.com/screencasts/v-dtrubyom/the-ruby-object-model-and-metaprogramming
‣ How nanocʼs Rules DSL Workshttp://stoneship.org/journal/2009/how-nanocs-rules-dsl-works/