def iftrue(parser, token):
    '''
    call the given method with the specified arguments.
    
        {% iftrue object.method arg, ... %}
            ....
        {% else %}
            ....
        {% endiftrue %}
        
        {% iftrue object.method arg1=arg1,arg2=arg2 ... %}
            ....
    '''
    
    bits = list(token.split_contents())
    if len(bits) < 2:
        raise TemplateSyntaxError, "%r takes at least two arguments" % bits[0]
    end_tag = 'end' + bits[0]
    nodelist_true = parser.parse(('else', end_tag))
    token = parser.next_token()
    if token.contents == 'else':
        nodelist_false = parser.parse((end_tag,))
        parser.delete_first_token()
    else:
        nodelist_false = NodeList()
        
    object = bits[1]
    args = []
    kwargs = {}
        
    bits = iter(bits[2:])
    for bit in bits:
        for arg in bit.split(","):
            if '=' in arg:
                k, v = arg.split('=', 1)
                k = k.strip()
                kwargs[k] = parser.compile_filter(v)
            elif arg:
                args.append(parser.compile_filter(arg))
                                
    return IfTrueNode(object, args, kwargs, nodelist_true, nodelist_false)
iftrue = register.tag(iftrue)

class IfTrueNode(Node):
    def __init__(self, object, args, kwargs, nodelist_true, nodelist_false):
        self.object, self.args, self.kwargs = object, args, kwargs
        self.nodelist_true, self.nodelist_false = nodelist_true, nodelist_false

    def __repr__(self):
        return "<IfTrueNode>"

    def render(self, context):
        args = [arg.resolve(context) for arg in self.args]
        kwargs = dict([(smart_str(k,'ascii'), v.resolve(context))
                       for k, v in self.kwargs.items()])
                
        obj_p = self.object.split('.')
        object = '.'.join(obj_p[:-1])
        method = ''.join(obj_p[-1:])
        obj = resolve_variable(object,context)
        func = getattr(obj,method)
        
        if func(*args, **kwargs):
            return self.nodelist_true.render(context)
        else:
            return self.nodelist_false.render(context)