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

Kale D. 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
[email protected]

On Wed, Feb 3, 2010 at 11:10 AM, Kale D. [email protected]
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?

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

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.

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

what you want to do, and what you want other people to be able to do.
That’s exactly what I had in mind. Thanks for fleshing it out!

Kind regards

robert

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

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

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

Josh C. 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: http://gist.github.com/294520

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 B., 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.

This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.

| Privacy Policy | Terms of Service | Remote Ruby Jobs