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 = 'exampleMixin'
# the following are all class variables if mixed into a class,
# instance variables for instances
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
finished mixing, postmix(klass=klass) is called """
def normalMethod(self, arg1, arg2):
"""a normal method that is moved into whatever object
or class or instance we might mix it 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. """