Dynamic Class Instance?

I am creating a Ruby script that basically:
1) Has a prompt that gets a command string (ex. 'edit user1 15')
2) Parses the string
3) Runs specific command (like 'edit' or 'new')
4) Repeats

From a functional level I know how to make this work, but how do I make
it dynamic in the sense that another user could easily add their own
commands by adding a new subclass?

I was thinking something like this:

class Update < Command
  ...
end

The problem is I don’t know how to dynamically create a new 'Update'
instance if that is the command string (ie 'update user')? I know how to
call a method using 'send' and I guess that would be another approach
maybe, but is there something for classes?

cmd = gets.chomp #ie 'update user'
c = cmd.split(' ')[0].new #simple parsing example
c.run

Thanks for any help!
Kale

···

--
Posted via http://www.ruby-forum.com/.

Kale Davis wrote:

I am creating a Ruby script that basically:
1) Has a prompt that gets a command string (ex. 'edit user1 15')
2) Parses the string
3) Runs specific command (like 'edit' or 'new')
4) Repeats

From a functional level I know how to make this work, but how do I make
it dynamic in the sense that another user could easily add their own
commands by adding a new subclass?

I was thinking something like this:

class Update < Command
  ...
end

The problem is I don’t know how to dynamically create a new 'Update'
instance if that is the command string (ie 'update user')? I know how to
call a method using 'send' and I guess that would be another approach
maybe, but is there something for classes?

Classes are objects too. They respond to Object#send.

cmd = gets.chomp #ie 'update user'
c = cmd.split(' ')[0].new #simple parsing example
c.run

Thanks for any help!
Kale

Best,

···

--
Marnen Laibow-Koser
http://www.marnen.org
marnen@marnen.org
--
Posted via http://www.ruby-forum.com/\.

You may be interested in a somewhat ancient project of mine called
Linen which does what you're describing:
http://bitbucket.org/laika/linen/src/

I haven't touched that code for years, and it had some issues when I
last worked with it, so I'm not really suggesting you use it, so much
as look at it for ideas of how to do what you want :slight_smile:

Ben

···

On Wed, Feb 3, 2010 at 11:10 AM, Kale Davis <kale.davis@gmail.com> wrote:

I am creating a Ruby script that basically:
1) Has a prompt that gets a command string (ex. 'edit user1 15')
2) Parses the string
3) Runs specific command (like 'edit' or 'new')
4) Repeats

From a functional level I know how to make this work, but how do I make
it dynamic in the sense that another user could easily add their own
commands by adding a new subclass?

Hi, not completely sure I understand what you are trying to do, but Robert's
post got me interested, and I wanted to try it out.
This is what I came up with: http://gist.github.com/294520

( mirrored at http://pastie.org/private/1gtz2apwaxac2rcgl3xsw because github
is having issues http://twitter.com/github/status/8627608544 )

Hopefully it's helpful, if not, maybe flesh out the example a bit more of
what you want to do, and what you want other people to be able to do.

For that he first needs the class instance. Something like cl = Object.const_get("Update") will do. Then you can do whatever you want to do with it. In this case all classes should probably share a common interface method, e.g.

class Command
   def execute(*args)
     raise "Not implemented"
   end
end

class Update < Command
   def execute(*a)
     ...
   end
end

Kind regards

  robert

···

On 03.02.2010 20:13, Marnen Laibow-Koser wrote:

Kale Davis wrote:

I am creating a Ruby script that basically:
1) Has a prompt that gets a command string (ex. 'edit user1 15')
2) Parses the string
3) Runs specific command (like 'edit' or 'new')
4) Repeats

From a functional level I know how to make this work, but how do I make
it dynamic in the sense that another user could easily add their own
commands by adding a new subclass?

I was thinking something like this:

class Update < Command
  ...
end

The problem is I don’t know how to dynamically create a new 'Update'
instance if that is the command string (ie 'update user')? I know how to
call a method using 'send' and I guess that would be another approach
maybe, but is there something for classes?

Classes are objects too. They respond to Object#send.

--
remember.guy do |as, often| as.you_can - without end
http://blog.rubybestpractices.com/

That's exactly what I had in mind. Thanks for fleshing it out!

Kind regards

  robert

···

On 02/04/2010 12:03 PM, Josh Cheek wrote:

[Note: parts of this message were removed to make it a legal post.]

Hi, not completely sure I understand what you are trying to do, but Robert's
post got me interested, and I wanted to try it out.
This is what I came up with: 294520’s gists · GitHub

( mirrored at http://pastie.org/private/1gtz2apwaxac2rcgl3xsw because github
is having issues http://twitter.com/github/status/8627608544 )

Hopefully it's helpful, if not, maybe flesh out the example a bit more of
what you want to do, and what you want other people to be able to do.

--
remember.guy do |as, often| as.you_can - without end
http://blog.rubybestpractices.com/

Josh Cheek wrote:

Hi, not completely sure I understand what you are trying to do, but
Robert's post got me interested, and I wanted to try it out.
This is what I came up with: 294520’s gists · GitHub

module Command
[...]
  def self.included( base )
    @registered_commands << base
  end

And when using a base class instead of a module, one could use the
Class#inherited hook (that's the route Ben Bleything, above, took in
'linen').

cmd_class = class_name.classify.constantize

Better let each command tell us its name, or names. It allows for
several names (aliases) for a command.

···

--
Posted via http://www.ruby-forum.com/\.