#!/usr/bin/env python
#
import json
from datetime import date, datetime
from functools import singledispatch


# uncomment if Python version < 3.4 and comment out above line
# from singledispatch import singledispatch


class Parrot():
    def __init__(self, name, color):
        self._name = name
        self._color = color

    @property
    def name(self):
        return self._name

    @property
    def color(self):
        return self._color


parrots = [
    Parrot('Polly', 'green'),
    Parrot('Peggy', 'blue'),
    Parrot('Roger', 'red'),
]

data = {
    'spam': [1, 2, 3],
    'ham': ('a', 'b', 'c'),
    'date': date(2014, 8, 1),
    'timestamp': datetime(2014, 8, 1, 15, 34, 19),
    'parrots': parrots,
}


@singledispatch
def encode(obj):
    return obj


@encode.register(date)
def encode_date(date_obj):
    return date_obj.isoformat()


@encode.register(Parrot)
def encode_parrot(parrot_obj):
    return {'name': parrot_obj.name, 'color': parrot_obj.color}


# register other encoding functions here

print(json.dumps(data, default=encode, indent=4))
