from direct.showbase.CountedResource import CountedResource
This class is an attempt to combine the RAIA idiom with reference counting semantics in order to model shared resources. RAIA stands for “Resource Allocation Is Acquisition” (see ‘Effective C++’ for a more in-depth explanation)
When a resource is needed, create an appropriate CountedResource object. If the resource is already available (meaning another CountedResource object of the same type already exists), no action is taken. Otherwise, acquire() is invoked, and the resource is allocated. The resource will remain valid until all matching CountedResource objects have been deleted. When no objects of a particular CountedResource type exist, the release() function for that type is invoked and the managed resource is cleaned up.
Define a subclass of CountedResource that defines the @classmethods acquire() and release(). In these two functions, define your resource allocation and cleanup code.
If you define your own __init__ and __del__ methods, you MUST be sure to call down to the ones defined in CountedResource.
Until we figure out a way to wrangle a bit more functionality out of Python, you MUST NOT inherit from any class that has CountedResource as its base class. In debug mode, this will raise a runtime assertion during the invalid class’s call to __init__(). If you have more than one resource that you want to manage/access with a single object, you should subclass CountedResource again. See the example code at the bottom of this file to see how to accomplish this (This is useful for dependent resources).