Gonna give a brief presentation on Doodle to the Ruby Users Group on Monday. While some folks can just wing it, I needed to prepare notes. The need for brevity and a large font for the projector requires a short and sweet summary.
In hopes of helping others, here’s what I’ve got…
#The old, painful way...
class Person
attr_accessor :name, :age, :occupation
def initialize(name, options = {})
options = {
:age => 30
}.merge(options)
@name = name
@age = options[:age]
@occupation = options[:occupation]
end
end
p Person.new('Matz', :occupation => 'Minor Deity')
#The new, improved way:
require 'rubygems'
require 'doodle'
class Animal < Doodle
has :age
end
p Animal.new(:age => 'Sparky')
#Wait, that's not quite right.
class Animal < Doodle
has :age, :kind => Numeric
end
begin
p Animal.new(:age => 'Sparky')
rescue Exception
p $! #Animal.age must be Numeric...
end
#Much better.
p Animal.new(:age => 3)
#Other ways:
p Animal 4
p Animal :age => 5
p Animal {age 6}
#All attributes are required...
begin
p Animal.new
rescue Exception
p $! #missing required attribute 'age'
end
#Unless an initial value is given...
class Animal < Doodle
has :age, :init => 1
end
p Animal.new
#"must" lets you validate with a block.
class Animal < Doodle
has :birthdate, :kind => Date do
must "not be in future" do |value|
value <= Date.today
end
end
end
begin
p Animal.new(
:birthdate => Date.parse('2999-12-31')
)
rescue Exception
p $! #Animal.birthdate must not be in future
end
p Animal.new(:birthdate => Date.parse('1999-12-31'))
#Collectors let you add items to a collection.
class Goose < Doodle
has :name
end
class Flock < Doodle
has :geese, :init => [], :collect => Goose
end
flock = Flock do
goose "Rebeccah"
goose "Jemima"
end
p flock.geese
#There's more:
#http://doodle.rubyforge.org/
#sudo gem install doodle