obj_mud
文件大小: unknow
源码售价: 5 个金币 积分规则     积分充值
资源说明:A bizarre MUD-like engine for navigating business objects.
# ObjMud #
ObjMud is a framework to provide a text-based adventure game interface into a 
business model.  It is geeky as all get out.  Its genesis was to support the
Zormk gem, which provides a Zork-like interface into ActiveRecord (and
potentially other ORM) models.  Beyond being an extremely geeky exercise in
mental masturbation, it actually serves a useful purpose (being able to
make sense of a really complex rails app with 400+ models) at least in the Zormk
case.
in a complicated enterprisy rails application (400+ models, some with like 12
mixins, etc...).

## How it Works ##
The user enters the ObjMud environment at a location, which is bound to a
business object.  The viewer is presented with a text rendering of the business
object at their current location.  The viewer uses a move command to navigate the
graph of locations and paths.  At each location, they have a re-rendering of
the business object at their location.  The viewer can terminate the session 
with a quit command.

## Demo Session ##
`rake demo` will start a demo session of the interface from the command line
terminal. The business object graph are of Persons that have relationships to
other Persons.  There are 3 persons in the graph.  Dick, Jane and Bob, each
with relationships between them.  You can test out an ObjMud session as
follows:

```
> rake demo
Welcome!  The minions of your project grow stronger...
[Dick(relatives: Jane, Joe)]
  Paths: Jane(relatives: Dick, Joe), Joe(relatives: Dick, Jane)

> help
Available commands: back, exit, go, help, look, ls, move, quit

> look /paths/i
  Paths: Jane(relatives: Dick, Joe), Joe(relatives: Dick, Jane)

> go jane
You move to Jane(relatives: Dick, Joe)...

[Jane(relatives: Dick, Joe)]
  Paths: Dick(relatives: Jane, Joe), Joe(relatives: Dick, Jane)

> go joe
You move to Joe(relatives: Dick, Jane)...

[Joe(relatives: Dick, Jane)]
  Paths: Dick(relatives: Jane, Joe), Jane(relatives: Dick, Joe)

> back
You move to Jane(relatives: Dick, Joe)...

[Jane(relatives: Dick, Joe)]
  Paths: Dick(relatives: Jane, Joe), Joe(relatives: Dick, Jane)

> exit
Goodbye!  The minions of your project grow weaker...
>
```

## Configuration ##
Configuration is done via an ObjMud.configure call.  If part of a rails
application, this should go in an initializer.  Here is the default values and
comments for each of the configuration options.

* `config.location_initializer`: locations are lazily iniatized whenever a user 
enters obj_mud, or moves down a path.  This callback allows you to initialize 
the business object of a location as appropriate to your use.  By default, it 
does nothing.
* `config.renderer`:  What will render business objects to the 
viewer.  The default renderer output can be seen in the demo.
* `config.path_detected`: Callable that accepts a user input and a path and 
returns true if the input identifies the path or false otherwise.  By default, 
if the input string matches the path's object (ignoring case), then this returns
true.
* `config.hello_msg`: A message to display to users when they enter obj mud
* `config.goodby_msg`:  A message to display to users when they leave the obj
mud

In practive, you will probably need to provide a location_initializer, renderer
and path_detected callable appropriate to your context.  You can look at the
demo rake task to see a working configuration example.

The configuration object passed to the block given the configure call is backed
by OpenStruct, so you are free to stick whatever other information you need
into the config to allow any further customizations to do their job.

```ruby
ObjMud.configure do |config|
  config.location_initializer = lambda {|location| do_something}
  config.renderer = MyRenderer
  config.path_detected = lambda {|input, path| do_something_else}
  config.arbitrary_config_value = "Foo"
end
```

## Commands ##
Commands are actions that the user can perform.  They should probably inherit
from ObjMud::Controller::Base which will give access to the controller invoking
the command (which gives access to everything else) and configuration values.

There are 3 hard requirements of command classes:
1. It implements a `for_command_inputs` class method that returns an array of
symbols that user input should match to invoke the command.
2. It implements a perform instance mthod that executes the command.
3. It registers itself with the Commands module via
`ObjMud::Controller::Commands.register(self)`

Here is an example command definition:

```ruby
class DanceCommand < ObjMud::Controller::Commands::Base
  def self.for_command_inputs
    [:dance]
  end

  def perform(*tokens)
    controller.display_output("You dance around")
  end

  ObjMud::Controller::Commands.register(self)
end
```

## Contribution ##
Fork, branch, commit, code, test, push, send pull request.

## License ##
ObjMud is copyright © 2012 by Lance Woodson.  It is free software and may
be redistributed under the terms in the LICENSE.txt file.


本源码包内暂不包含可直接显示的源代码文件,请下载源码包。