text: #!/usr/bin/env python
  # -*- coding: utf-8 -*-
  
  """
  *What is this pattern about?
  The Decorator pattern is used to dynamically add a new feature to an
  object without changing its implementation. It differs from
  inheritance because the new feature is added only to that particular
  object, not to the entire subclass.
  
  *What does this example do?
  This example shows a way to add formatting options (boldface and
  italic) to a text by appending the corresponding tags (<b> and
  <i>). Also, we can see that decorators can be applied one after the other,
  since the original text is passed to the bold wrapper, which in turn
  is passed to the italic wrapper.
  
  *Where is the pattern used practically?
  The Grok framework uses decorators to add functionalities to methods,
  like permissions or subscription to an event:
  http://grok.zope.org/doc/current/reference/decorators.html
  
  *References:
  https://sourcemaking.com/design_patterns/decorator
  
  *TL;DR80
  Adds behaviour to object without affecting its class.
  """
  
  from __future__ import print_function
  
  class TextTag(object):
      """Represents a base text tag"""
      def __init__(self, text):
          self._text = text
  
      def render(self):
          return self._text
  
  
  class BoldWrapper(TextTag):
      """Wraps a tag in <b>"""
      def __init__(self, wrapped):
          self._wrapped = wrapped
  
      def render(self):
          return "<b>{}</b>".format(self._wrapped.render())
  
  
  class ItalicWrapper(TextTag):
      """Wraps a tag in <i>"""
      def __init__(self, wrapped):
          self._wrapped = wrapped
  
      def render(self):
          return "<i>{}</i>".format(self._wrapped.render())
  
  if __name__ == '__main__':
      simple_hello = TextTag("hello, world!")
      special_hello = ItalicWrapper(BoldWrapper(simple_hello))
      print("before:", simple_hello.render())
      print("after:", special_hello.render())
  
  ### OUTPUT ###
  # before: hello, world!
  # after: <i><b>hello, world!</b></i>
  