T
Thomas
Hi,
I would like to announce 0.1 of contraint.rb. This is a first draft.
This library provides a way to ensure that object always satisfy a
specified set of constraints. An object that can be constrained must be
of kind Constraint::Shell. Constraints can be added to classes and
single objects. It is possible to define methods that handle constraint
violations and can make the object fit the demands.
Project
http://rubyforge.org/projects/constraint/
Download
http://rubyforge.org/frs/?group_id=748
Support
http://rubyforge.org/forum/?group_id=748
In my personal experience, a certain type of error in dynamically typed
languages is caused by pushing a wrong object to a collection or
similar. What makes this type of error so awkward is that they often
result in an exception in a different part of your program, which is why
it can be unnecessarily difficult to track down what is actually causing
the problem. The goal of this library is to raise an exception right
where such a thing happens.
Constrained classes should inherit from Constraint::Shell. The subclass
should provide a way for defining new instances (by defining
#new_constrained) and redefine #processconstrainedvalue. The
@constrained_value instance variable contains the shell's actual values.
Examples:
class ConstrainedArray < Constraint::Shell
def new_constrained
[]
end
def process_constrained_value
@constrained_value.collect! {|e| yield e}
end
end
class NumericArray < ConstrainedArray
or_constraint("Numeric") {|e| e.kind_of?(Numeric)}
end
class EvenNumericArray < NumericArray
and_constraint("Even") {|e| e.modulo(2) == 0}
end
class EvenInteger < Constraint::Shell
and_constraint("Numeric") {|e| e.kind_of?(Integer)}
and_constraint("Even") {|e| e.modulo(2) == 0}
end
enum = EvenInteger.new(2)
enum.and_constraint("LT10") {|e| e < 10}
or:
class DuckPalace < ConstrainedArray
and_constraint('Quack') {|e| e.do_you_quack?}
and_constraint('Ticket') {|e| e.your_ticket_please == :valid}
end
whiteduckpalace = DuckPalace.new
whiteduckpalace.and_constraint('White') {|e| e.colour == 'white'}
class << whiteduckpalace
def handle_constraint_violation(contraint_name, object)
case contraint_name
when 'white'
return object.paint_me('white') if
object.respond_to?paint_me)
end
return super
end
end
Regards,
Thomas.
___________________________________________________________
Gesendet von Yahoo! Mail - Jetzt mit 1GB Speicher kostenlos - Hier anmelden: http://mail.yahoo.de
I would like to announce 0.1 of contraint.rb. This is a first draft.
This library provides a way to ensure that object always satisfy a
specified set of constraints. An object that can be constrained must be
of kind Constraint::Shell. Constraints can be added to classes and
single objects. It is possible to define methods that handle constraint
violations and can make the object fit the demands.
Project
http://rubyforge.org/projects/constraint/
Download
http://rubyforge.org/frs/?group_id=748
Support
http://rubyforge.org/forum/?group_id=748
In my personal experience, a certain type of error in dynamically typed
languages is caused by pushing a wrong object to a collection or
similar. What makes this type of error so awkward is that they often
result in an exception in a different part of your program, which is why
it can be unnecessarily difficult to track down what is actually causing
the problem. The goal of this library is to raise an exception right
where such a thing happens.
Constrained classes should inherit from Constraint::Shell. The subclass
should provide a way for defining new instances (by defining
#new_constrained) and redefine #processconstrainedvalue. The
@constrained_value instance variable contains the shell's actual values.
Examples:
class ConstrainedArray < Constraint::Shell
def new_constrained
[]
end
def process_constrained_value
@constrained_value.collect! {|e| yield e}
end
end
class NumericArray < ConstrainedArray
or_constraint("Numeric") {|e| e.kind_of?(Numeric)}
end
class EvenNumericArray < NumericArray
and_constraint("Even") {|e| e.modulo(2) == 0}
end
class EvenInteger < Constraint::Shell
and_constraint("Numeric") {|e| e.kind_of?(Integer)}
and_constraint("Even") {|e| e.modulo(2) == 0}
end
enum = EvenInteger.new(2)
enum.and_constraint("LT10") {|e| e < 10}
or:
class DuckPalace < ConstrainedArray
and_constraint('Quack') {|e| e.do_you_quack?}
and_constraint('Ticket') {|e| e.your_ticket_please == :valid}
end
whiteduckpalace = DuckPalace.new
whiteduckpalace.and_constraint('White') {|e| e.colour == 'white'}
class << whiteduckpalace
def handle_constraint_violation(contraint_name, object)
case contraint_name
when 'white'
return object.paint_me('white') if
object.respond_to?paint_me)
end
return super
end
end
Regards,
Thomas.
___________________________________________________________
Gesendet von Yahoo! Mail - Jetzt mit 1GB Speicher kostenlos - Hier anmelden: http://mail.yahoo.de