Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

[ANN] constraint 0.1 -- ensure that object always satisfy a specified set of constraints

0 views
Skip to first unread message

Thomas

unread,
Jun 10, 2005, 1:27:27 PM6/10/05
to
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


0 new messages