Could you contrast Lafcadio to ActiveRecord? thx sera / fhwang.net wrote: > Here's another library that comes from Lafcadio: ContextualService. > > The ContextualService library makes it easy to manage and set services > to a single, global resource such as a database or file system. By > defining a service to be a child of ContextualService::Service, you > * lock off access to instantiation, so all access have to go through > the service's get method, > * and provide a simple way to set the instance, most likely for > testing. > > For example, Lafcadio ( http://lafcadio.rubyforge.org ) uses > ContextualService to manage access to the ObjectStore, which controls > access to a database. > > class Lafcadio::ObjectStore < ContextualService::Service > def initialize > ... > end > end > > ObjectStore.new will raise an error. To get an instance of ObjectStore, > you call ObjectStore.get_object_store. If no instance has been > previously set, this will instantiate the ObjectStore and save the > instance for future accesses. If a mock instance has been previously > set > with set_object_store, it will simply return that mock instance. > > Since access to the global service is attached to the class, there's no > need to pass in a mock service as an argument to any method that needs > it. This can simplify testing considerably if you've got highly > decomposed code that needs to access a global service from many places. > Also, since the Context object is hidden, clients of the service don't > have to be conscious of it. > > def some_method > os = Lafcadio::ObjectStore.get_object_store > # do something with the object store here > some_other_method > end > > def some_other_method > os = Lafcadio::ObjectStore.get_object_store > # do something with the object store here, too > end > > class TestSomeMethod < Test::Unit::TestCase > def test1 > mock_object_store = Lafcadio::MockObjectStore.new > Lafcadio::ObjectStore.set_object_store mock_object_store > some_method > # assert something happened > end > end > > The project page can be found at > http://rubyforge.org/projects/contxtlservice .