int main(int argc, char ** argv)
{

    DebugInfo::set_visible(true);
    
    typedef std::vector<Checker *> V_VEC;

    V_VEC checkers;
    checkers.push_back(new IntChecker());
    //checkers.push_back(new IntChecker(0));
    //checkers.push_back(new IntChecker(0, 100));
    //checkers.push_back(new FloatChecker());
    checkers.push_back(new FloatChecker(0.5));
    //checkers.push_back(new FloatChecker(0.5, 9.5));
    //checkers.push_back(new StrChecker());
    //checkers.push_back(new StrChecker(2));
    checkers.push_back(new StrChecker(2, 7));
    checkers.push_back(new BoolChecker());
    checkers.push_back(new ListChecker());
    //checkers.push_back(new ListChecker(2));
    //checkers.push_back(new ListChecker(2, 7));
    checkers.push_back(new TupleChecker(2, 7));
    checkers.push_back(new DictChecker(2, 7));
    checkers.push_back(new IntListChecker());
    checkers.push_back(new FloatListChecker());
    checkers.push_back(new StrListChecker());
    checkers.push_back(new BoolListChecker());
    checkers.push_back(new PassChecker());
    List l;
    l.append(-10);
    l.append("Hi");
    l.append(2.3);
    checkers.push_back(new OptionChecker(l));

    typedef std::vector<Object> O_VEC;

    O_VEC objects;
    objects.push_back(Int(-10));
    //objects.push_back(Int(10));
    //objects.push_back(Int(1000));
    objects.push_back(Float(0.0));
    //objects.push_back(Float(0.3));
    //objects.push_back(Float(9.1));
    objects.push_back(Str("H"));
    objects.push_back(Str("Hi"));
    objects.push_back(Str("Hello, world!"));
    objects.push_back(Bool(true));
    //objects.push_back(unrepr("[1]"));
    //objects.push_back(unrepr("[1, 2, 3, 4, 5]"));
    //objects.push_back(unrepr("[0.1, 0.2, 0.3, 0.4, 0.5]"));
    //objects.push_back(unrepr("[\"a\", \"b\", \"c\", \"d\", \"e\"]"));
    //objects.push_back(unrepr("(2, 3, 4.5, 4)"));
    //objects.push_back(unrepr("{\"a\":2, \"b\":0.3, \"c\":.5, \"d\": 0.6}"));
    objects.push_back(unrepr("[1, 0.2, \"three\", True]"));
    
    for(V_VEC::const_iterator iv = checkers.begin(); iv != checkers.end(); ++iv)
    {
        Checker * v = *iv;
        cout << "=== " << *v << endl;
        for(O_VEC::iterator io = objects.begin(); io != objects.end(); ++io)
        {
            Object & p = *io;
            cout << "       " << *io << " --> " << v->validate(p) << endl;
/*
            try
            {
                v->check(p);
            }
            catch(EXC_T & e)
            {
                cerr << "ERR: " << e.what() << endl;
            }
*/
        }
    }
    
    for(V_VEC::iterator iv = checkers.begin(); iv != checkers.end(); ++iv)
    {
        //cout << "deleting " << *iv << "..." << endl;
        delete *iv;
    }
}