Has a prompt that gets a command string (ex. ‘edit user1 15’)
Parses the string
Runs specific command (like ‘edit’ or ‘new’)
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
Has a prompt that gets a command string (ex. ‘edit user1 15’)
Parses the string
Runs specific command (like ‘edit’ or ‘new’)
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
Has a prompt that gets a command string (ex. ‘edit user1 15’)
Parses the string
Runs specific command (like ‘edit’ or ‘new’)
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 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
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
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
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.