[ANN] BlockChainable 0.0.1 released

D

Drew Olson

BlockChainable is a module to aid in the creation of Domain Specific
Languages using block structure. By including BlockChainable into your
classes, you will be able to instantiate that class using the class name
itself, followed by any parameters to be passed to initialize, followed
by a block to be executed within the instantiated class.

BlockChainable also allows methods to search up the chain of classes,
meaning that although a block is executed in the scope of the
instantiated class, any methods not found in the class but found in a
class "up-scope" will be called successfully on the up-scope class. This
chaining of method calls allows you to assert values within the blocks
as well as calling any other methods from "up-scope" classes.

I know, I know, I need a better description :) Take a look at a usage
example more some simple ideas on using BlockChainable. And afterwards,
install it like so:

sudo gem install block-chainable

# a simple dsl for creating classroom rosters and printing them out.
code can be found in the
# example directory of BlockChainable.

require 'block_chainable'

# first, define our roster
class Roster
include BlockChainable

def initialize(subject)
@subject = subject
@students = []
end

def add_student_to_roster student
@students << student
end

def print_roster
puts "Roster for #{@subject}:"
@students.each{|s| puts " #{s}"}
end
end

# next, define our student. the only tricky part here is
add_to_roster, which calls
# the method add_student_to_roster, which is actually defined on the
Roster class.
# BlockChainable will automatically send this method to the Roster
class with the
# Student instance as a parameter.
class Student
include BlockChainable

def add_to_roster
add_student_to_roster self
end

def to_s
"#{@last_name}, #{@first_name} - age #{@age}"
end

def first_name name
@first_name = name
end

def last_name name
@last_name = name
end

def age years
@age = years
end
end

# we now have all the pieces we need for creating a simple dsl for
building
# and printing a class roster

Roster :Math do
Student do
first_name "Drew"
last_name "Olson"
age 25

add_to_roster
end

Student do
first_name "John"
last_name "Doe"
age 17

add_to_roster
end

Student do
first_name "Jane"
last_name "Doe"
age 19

add_to_roster
end

print_roster
end
 
T

Trans

BlockChainable is a module to aid in the creation of Domain Specific
Languages using block structure. By including BlockChainable into your
classes, you will be able to instantiate that class using the class name
itself, followed by any parameters to be passed to initialize, followed
by a block to be executed within the instantiated class.

BlockChainable also allows methods to search up the chain of classes,
meaning that although a block is executed in the scope of the
instantiated class, any methods not found in the class but found in a
class "up-scope" will be called successfully on the up-scope class. This
chaining of method calls allows you to assert values within the blocks
as well as calling any other methods from "up-scope" classes.

I know, I know, I need a better description :) Take a look at a usage
example more some simple ideas on using BlockChainable. And afterwards,
install it like so:

He he. You could use Zope terminology, "acquisition" :)
sudo gem install block-chainable

# a simple dsl for creating classroom rosters and printing them out.
code can be found in the
# example directory of BlockChainable.

require 'block_chainable'

# first, define our roster
class Roster
include BlockChainable

def initialize(subject)
@subject = subject
@students = []
end

def add_student_to_roster student
@students << student
end

def print_roster
puts "Roster for #{@subject}:"
@students.each{|s| puts " #{s}"}
end
end

# next, define our student. the only tricky part here is
add_to_roster, which calls
# the method add_student_to_roster, which is actually defined on the
Roster class.
# BlockChainable will automatically send this method to the Roster
class with the
# Student instance as a parameter.

So I take it that the Student class does'nt work on it's own because
it would not be able to find #add_student_to_roster --sort of like the
opposite of a class using a mixin and not providing a prerequisite
method.

This is an interesting library. I'm curious to see the underlying meta-
programming.

T.
 
D

Drew Olson

Trans said:
He he. You could use Zope terminology, "acquisition" :)


So I take it that the Student class does'nt work on it's own because
it would not be able to find #add_student_to_roster --sort of like the
opposite of a class using a mixin and not providing a prerequisite
method.

This is an interesting library. I'm curious to see the underlying meta-
programming.

T.

Trans -

You're exactly right. I actually considered now including the example
because of this, but I thought it clarified some of the ideas from the
description. If we wanted to remove the coupling, I could actually just
call the Roster method directly from the Student block, passing self as
the argument. I didn't like having to pass self, so I encapsulated the
call into a student method, but, as you said, this does tie the Student
implementation to the Roster implemetation. I'll consider changing this
example.

As far as the meta-programming, download the source :) It's only 30
lines of meta-goodness.

- Drew
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Similar Threads


Members online

Forum statistics

Threads
473,968
Messages
2,570,152
Members
46,697
Latest member
AugustNabo

Latest Threads

Top