class exampleMixin(someOtherMixin):
""" example mixin """
# the following are all mixin internal instructions###########################################
# specify this explicitly if someOtherMixin was abstract.
_mixin_abstractMixin = False
# if __called__() with no arguments, this value is necessary. one is class, 'two' is a fully
# qualified class name string (in case two is not safe to import directly, strings are allowed)
_mixin_targetClasses = [one, "two"]
#
_mixin_name = 'ringMixin'
# the following are all class variables if mixed into a class, instance variables for instance#
myvar = None
myvar2 = None
# now the methods follow#######################################################################
@staticmethod
def postmix(klass=None, instance=None):
"""if this mixin is called on klass, when it is done postmix(klass=klass) is called"""
def normalMethod(self, arg1, arg2):
"""a normal method that is moved into whatever object we mix into """
@chainiff('chain_target', when=lambda mix_target: hasattr(mix_target,'special'), how='before')
def conditionalMethod(self, **kargs):
""" on __call__(), this conditionalMethod is chained before the method named
'chain_target' (which must already exist inside the mix_target) if and only if
mix_target has an attribute called 'special'. if this method returns anything
besides None, the return value is expected to be the modified keyword-arguments
which should then passed on to the original chain_target """
return kargs
@plugiff(lambda mix_target: issubclass(mix_target,some_special_class), overwrite=True)
def pluggedMethod(self):
""" on __call__(), this pluggedMethod is plugged into mix_target if and only if
mix_target is a subclass of some_special_class. since overwrite=True, if the name
mix_target.pluggedMethod already existed, it would be overwritten silently. """