On 10/28/05, Ara.T.Howard <Ara.T.Howard / noaa.gov> wrote:
> On Fri, 28 Oct 2005, swille wrote:
>
> > I'm admittedly quite a novice with programming.  I'm sort of playing around
> > with some ideas, and I'm wondering if what I'm doing is completely stupid,
> > and if not, is there a better way to do it?  Also, is there any way that I
> > could do some type of type-ish validation on the data?
> >
> > Basically, I want to provide what I suppose would be abstract class (?),
> > which someone else could extend and add attributes if they'd like.  I'd like
> > to be able to look into the class and pick out the attributes to populate
> > (which is the reason for all of the sp_set & sp_get stuff).  Basically, my
> > thought is to be able to provide a web interface at some point to populate
> > the needed data of a class, and then maybe Marshal.dump the object to a
> > database and call it later using that data as config data essentially.  I'm
> > sure I could learn a ton about this from reading Rails code, but there's so
> > much of it that I don't know where to look.  Output and code follows.
> > Please feel free to tell me if this is dumb :O)
>
> i think what you want is traits:
>
>    harp:~ > cat a.rb
>    require 'traits'
>    require 'readline'
>
>    class ServiceProfile
>      trait 'url', 'type' => String, 'case' => %r|^http://|
>      trait 'username', 'type' => String
>      trait 'password', 'type' => String
>      trait 'certificate', 'munge' => 'to_i', 'case' => Fixnum
>      trait 'owner', 'type' => String
>
>      def inspect
>        "#{ self.class }( " << klass.reader_traits.map{|t| "#{ t }:#{ send(t).inspect}" }.join(', ') << " )"
>      end
>      def input io
>        klass::writer_traits.each{|t| send t, Readline::readline("#{ t } ")}
>      end
>      def klass
>        self.class
>      end
>    end
>
>    class MyService < ServiceProfile
>      trait 'extra', 'munge' => 'to_f', 'ducktypes' => %w( floor ceil )
>    end
>
>    my_service = MyService::new
>    p my_service
>
>    my_service.input STDIN
>    p my_service
>
>
>    harp:~ > ruby a.rb
>    MyService( extra:nil, certificate:nil, owner:nil, password:nil, url:nil, username:nil )
>    extra= 42.0
>    certificate= 42abcd
>    owner= me
>    password= tru5t
>    url= http://codeforpeople.com/lib/ruby/traits/
>    username= ahoward
>    MyService( extra:42.0, certificate:42, owner:"me", password:"tru5t", url:"http://codeforpeople.com/lib/ruby/traits/", username:"ahoward" )
>
> regards.
>
>
> -a
> --
> ===============================================================================
> | email :: ara [dot] t [dot] howard [at] noaa [dot] gov
> | phone :: 303.497.6469
> | anything that contradicts experience and logic should be abandoned.
> | -- h.h. the 14th dalai lama
> ===============================================================================
>
>
>

Wow, that's really nice.  All of these suggestions are great.  I
definitely needed the guidance.  I'm glad David posted.  He really
made me realize how much I was overthinking this.  For some reason, I
got stuck on some type of reflection for this.  I really like this
traits thing though, and I'd like to explore that a bit.  Where can I
get that from?  I might have to study the source on that one.