from panda3d.core import *
from direct.showbase import Pool
from direct.showbase.DirectObject import DirectObject
import re

class PooledEffect(DirectObject, NodePath):
    pool = None
    poolLimit = 124

    @classmethod
    def getEffect(cls, context = ''):
        if cls.pool is None:
            cls.pool = Pool.Pool()
        if cls.pool.hasFree():
            return cls.pool.checkout()
        else:
            free, used = cls.pool.getNumItems()
            if free + used < cls.poolLimit:
                cls.pool.add(cls())
                return cls.pool.checkout()
            else:
                return
        return

    @classmethod
    def cleanup(cls):
        if cls.pool:
            cls.pool.cleanup(cls.destroy)
            cls.pool = None
        return

    def __init__(self):
        NodePath.__init__(self, self.__class__.__name__)
        self.accept('clientLogout', self.__class__.cleanup)

    def destroy(self, item = None):
        if item:
            self.pool.remove(item)
        self.ignore('clientLogout')
        self.removeNode()