From: Robert Klemme Date: 2006-09-03T03:50:37+09:00 Subject: Re: Class behaviour Geoff Barnes wrote: > Just curious, can I write a class that can check values as they are > assigned to objects? > > foo = Klass.new > foo.legal_values = (4..10) > > foo.value = 5 # OK > foo.value = 11 # ERROR - out of bounds, raise exception or something You can define a special class method as a replacement for attr_accessor: class Module def checked_attr(name,&test) define_method("#{name}=") do |val| test[val] or raise ArgumentError instance_variable_set "@#{name}", val end attr_reader name end end class T checked_attr :foo do |x| x >= 0 end end irb(main):018:0* t=T.new => # irb(main):019:0> t.foo = 10 => 10 irb(main):020:0> t.foo = -10 ArgumentError: ArgumentError from (irb):4:in `foo=' from (irb):20 from :0 irb(main):021:0> > Also, do I have to have an explicit method for the 'value', or can it > operate like a "builtin" class, like this : > > foo = Klass.new > foo.legal_values = (4..10) > > foo = 5 # OK > foo = 11 # ERROR - out of bounds, raise exception or something You cannot interfere here so there is no way to check these assignments. > In Perl, I would probably use tiescalar for something like this, where I > can intercept an assignment... > > Also, it may not be numbers, but enums as well. I'm not sure I understand you here. Kind regards robert